Entendendo e criando números aleatórios

841 views
Skip to first unread message

Lucas Parrini

unread,
Oct 21, 2010, 2:47:35 PM10/21/10
to Lua BR
Olá pessoal.
Eu disse que voltaria, não disse? Rs!

Estou aprendendo a gerar números aleatórios e consegui estas duas
maneiras:
http://codepad.org/7xE7yqh7

Gostaria de saber se vocês conhecem outras maneiras além dessas duas
contidas no link, de gerar números aleatórios.

Gostaria também de entender melhor o "seed", como ele funciona.
Percebi que o math.randomseed (os.time()) se relaciona com o tempo do
sistema operacional e que ao executar um scrip simples rapidamente,
digamos que 3 vezes por segundo, eu tenho o mesmo resultado nessas 3
vezes, só alterando o resultado quando os segundos do meu relógio de
alteram.

O math.randomseed (os.time()) analisa o tempo e quando e percebe
quando o mesmo muda, por isso ele serve para gerar números aleatórios?
Ele pega o tempo e multiplica por algum número, ele armazena o tempo
na memória, como é que ele funciona afinal de contas? Isso que não
está claro para mim, a sua mecânica.

É possível criar em Lua algum script que gere um número aleatório toda
vez que for executado, não importando o tempo?

Obrigado pelo compartilhamento de conhecimento.
Grande abraço.

Daniel Ribeiro

unread,
Oct 21, 2010, 3:00:54 PM10/21/10
to lua...@googlegroups.com
O math.randomseed serve para configurar a semente do gerador de números aleatórios.

Da uma olhada nesse link que pode facilitar... http://lua-users.org/wiki/MathLibraryTutorial


2010/10/21 Lucas Parrini <lucas....@parrini.com.br>



--
Daniel Ribeiro

Fernando Araújo

unread,
Oct 21, 2010, 3:04:33 PM10/21/10
to lua...@googlegroups.com
Olhe as bibliotecas de geração de números aleatórios de um programa chamado Matlab. Tem condensadas em um mesmo lugar diversas funções de geração de aleatórios bem avaçadas.

Abraços,
--
Fernando Araujo




2010/10/21 Daniel Ribeiro <ribeiro...@gmail.com>

Lucas Parrini

unread,
Oct 22, 2010, 8:07:42 AM10/22/10
to Lua BR
Outra dúvida que surgiu:

random.seed é declarado apenas uma única vez.
Mas isso quer dizer que independentemente de um programa escrito com
100 linhas e outro com 25000, se eu for usar números aleatórios nos
dois, eu declaro apenas uma vez o random.seed. Certo?

Erica Souza

unread,
Oct 22, 2010, 10:49:58 AM10/22/10
to lua...@googlegroups.com
OMG .... eu to penando com isso =/ 


sim , o engraçado é que ele gera no emulador da TV Digital , mas qd joga no Set-top box ele gera sempre a mesma sequencia , alguem tem alguma sugestao de como resolver isso ?


--



--
Erica

Estudante de Engenharia da Computação
Computer Engineering Student

Universidade Federal do Amazonas - UFAM
(Federal University of Amazonas)

Manaus - Amazonas - Brazil

Stephen Eilert

unread,
Oct 22, 2010, 10:52:25 AM10/22/10
to lua...@googlegroups.com
2010/10/22 Lucas Parrini <lucas....@parrini.com.br>:

Certo.

Mas note que são números *pseudo*aleatórios, não são números
aleatórios. O gerador gera uma sequência que é difícil de ser
prevista, mas é uma sequência. Imagine que o "seed" diz aonde nessa
sequência você inicia. A partir daí, cada chamada ao random pega o
próximo número da sequência.


--Stephen

Sent from my Emacs

Lucas Parrini

unread,
Oct 22, 2010, 1:10:40 PM10/22/10
to Lua BR
> Certo.
>
> Mas note que são números *pseudo*aleatórios, não são números
> aleatórios. O gerador gera uma sequência que é difícil de ser
> prevista, mas é uma sequência. Imagine que o "seed" diz aonde nessa
> sequência você inicia. A partir daí, cada chamada ao random pega o
> próximo número da sequência.
>
> --Stephen
>
> Sent from my Emacs


Isso, pseudo-aleatórios. Eu li sobre isso quando pesquisei sobre, mas
sua explicação ficou bem melhor (rápida e objetiva além de clara) do
que as que encontrei.

Então realmente em Lua não é possível criar um número aleatório de
verdade, aleatório MESMO?! Rs!
Na prática, desconsiderando o fato de que a sequência possa ser
prevista, existe diferença entre um número pseudo-aleatório e um
aleatório?

Elvio Gomes

unread,
Oct 22, 2010, 2:27:51 PM10/22/10
to lua...@googlegroups.com
Amigo, acredito que em nenhuma linguagem ou tecnologia seja possível gerar um número aleatório de verdade, ainda, esse inclusive é o grande diferencial da computação quântica.

A diferença básica a meu ver entre aleatório e pseudo-aleatório, é que o primeiro não segue nenhuma regra para ser gerada, não há como prever o que será gerado, enquanto o segundo obedece uma regra pré-definida, por mais complexa que seja, e por mais que pareça ser aleatório há algo definindo aquela aleatoriedade.

[ ]'s
Elvio




--
"Numa moldura clara e simples sou aquilo que se vê"

"Sabe-se muito pouco"

"Hatuna Matata"

Alex Queiroz

unread,
Oct 22, 2010, 2:41:46 PM10/22/10
to lua...@googlegroups.com
Hallo,

2010/10/22 Elvio Gomes <elv...@gmail.com>:


> Amigo, acredito que em nenhuma linguagem ou tecnologia seja possível gerar
> um número aleatório de verdade, ainda, esse inclusive é o grande diferencial
> da computação quântica.
>

http://www.random.org/

--
-alex
http://www.artisancoder.com/

Henrique Becker

unread,
Oct 22, 2010, 2:44:38 PM10/22/10
to lua...@googlegroups.com
Como Lua geraria números verdadeiramente aleatórios?
Suponha que você tivesse um algoritmo para gerar uma sequência de
números aleatórios (em lua ou implementado como um circuito do
hardware, tanto faz). Se você tem um algoritmo que gera a sequência,
você pode prever os números que são gerados executando a sequência
(executando o algoritmo, por exemplo), logo ela não é aleatória. É
impossível criar o aleatório com algoritmos, pois o aleatório não
possui algoritmo, é aleatório.
O que é usado para conseguir números aleatórios no linux, por exemplo,
é acessar um pseudo-arquivo que capta a entrada do usuário (fonte de
aleatoriedade verdadeira) e a guarda distorcida.
Acho que o fato de um poder ser previsto e outro não é a essência da
aleatoriedade, mas você pode ter outros problemas, como depender de um
determindado resultado aleatório (por exemplo, vou ficar jogando o
dado até dar 6), mas devido a natureza da fonte pseudo aleatória você
possui 0% de chance de obter aquele valor, enquanto em com uma
aleatoriedade real isso não pode acontecer.

Saudações,
Henrique Becker

Em 22/10/10, Lucas Parrini<lucas....@parrini.com.br> escreveu:

Lucas Parrini

unread,
Oct 22, 2010, 2:56:38 PM10/22/10
to Lua BR
Hummmmm.... Agora essa questão de número aleatório está ficando mais
clara.
Muito obrigado a todos pelo compartilhamento de informações e idéias,
obrigado mesmo.

Surgindo mais dúvidas ou idéias sobre este assunto, devo postar aqui
mesmo, certo?

Abraços.
Lucas

On 22 out, 15:44, Henrique Becker <henriquebecke...@gmail.com> wrote:
> Como Lua geraria números verdadeiramente aleatórios?
> Suponha que você tivesse um algoritmo para gerar uma sequência de
> números aleatórios (em lua ou implementado como um circuito do
> hardware, tanto faz). Se você tem um algoritmo que gera a sequência,
> você pode prever os números que são gerados executando a sequência
> (executando o algoritmo, por exemplo), logo ela não é aleatória. É
> impossível criar o aleatório com algoritmos, pois o aleatório não
> possui algoritmo, é aleatório.
> O que é usado para conseguir números aleatórios no linux, por exemplo,
> é acessar um pseudo-arquivo que capta a entrada do usuário (fonte de
> aleatoriedade verdadeira) e a guarda distorcida.
> Acho que o fato de um poder ser previsto e outro não é a essência da
> aleatoriedade, mas você pode ter outros problemas, como depender de um
> determindado resultado aleatório (por exemplo, vou ficar jogando o
> dado até dar 6), mas devido a natureza da fonte pseudo aleatória você
> possui 0% de chance de obter aquele valor, enquanto em com uma
> aleatoriedade real isso não pode acontecer.
>
> Saudações,
> Henrique Becker
>
> Em 22/10/10, Lucas Parrini<lucas.skl...@parrini.com.br> escreveu:

Luis Carvalho

unread,
Oct 22, 2010, 3:45:21 PM10/22/10
to lua...@googlegroups.com
> Surgindo mais d�vidas ou id�ias sobre este assunto, devo postar aqui
> mesmo, certo?

Contanto que envolva Lua, sim.

Aqui vai outra dica: o binding do gerador Mersenne Twister, do lhf,

http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/5.1/lrandom.tar.gz

Luiz, por que a rotina "value" gera numeros uniformes com 53 bits de
resolucao (em vez de 32)? Acho que seja mais comum usar a rotina genrand_real2
em vez de genrand_res53, nao? Voce tem algum motivo ou referencia que
recomende esse uso?

Falou,
K.

--
Computers are useless. They can only give you answers.
-- Pablo Picasso

--
Luis Carvalho (Kozure)
lua -e 'print((("lexca...@NO.gmail.SPAM.com"):gsub("(%u+%.)","")))'

Stephen Eilert

unread,
Oct 22, 2010, 4:26:17 PM10/22/10
to lua...@googlegroups.com
2010/10/22 Alex Queiroz <asan...@gmail.com>:

> Hallo,
>
> 2010/10/22 Elvio Gomes <elv...@gmail.com>:
>> Amigo, acredito que em nenhuma linguagem ou tecnologia seja possível gerar
>> um número aleatório de verdade, ainda, esse inclusive é o grande diferencial
>> da computação quântica.

Uma CPU não consegue, mas basta adicionar hardware especializado.
Afinal, fenômenos quânticos não estão restritos a computadores
quânticos.

http://en.wikipedia.org/wiki/Hardware_random_number_generator

Luiz Henrique de Figueiredo

unread,
Oct 22, 2010, 4:44:03 PM10/22/10
to lua...@googlegroups.com
> Luiz, por que a rotina "value" gera numeros uniformes com 53 bits de
> resolucao (em vez de 32)?

Os n�meros de Lua s�o double, com matissa de 53 bits. Assim, "value"
retorna um n�mero entre 0 e 1 com todos os bits da mantissa aleat�rios.
Al�m disso, genrand_res53 faz parte do c�digo original de random.c.

Luiz Henrique de Figueiredo

unread,
Oct 22, 2010, 4:55:58 PM10/22/10
to lua...@googlegroups.com
> Aqui vai outra dica: o binding do gerador Mersenne Twister, do lhf,

Esse mesmo binding funciona outros geradores, e.g. o taus88 descrito em

http://www.ams.org/journals/mcom/1996-65-213/S0025-5718-96-00696-5/home.html

Basta usar o c�digo abaixo em vez de random.c.

typedef struct { unsigned long s1, s2, s3; } TAUSS;

#define s1 c->s1
#define s2 c->s2
#define s3 c->s3

static double taus88(TAUSS *c)
{ /* Generates numbers between 0 and 1. */
unsigned long b;
b = (((s1 << 13) ^ s1) >> 19);
s1 = (((s1 & 4294967294UL) << 12) ^ b);
b = (((s2 << 2) ^ s2) >> 25);
s2 = (((s2 & 4294967288UL) << 4) ^ b);
b = (((s3 << 3) ^ s3) >> 11);
s3 = (((s3 & 4294967280UL) << 17) ^ b);
return ((s1 ^ s2 ^ s3) * 2.3283064365e-10);
}

#define MT TAUSS
#define genrand_res53 taus88

static void init_genrand(MT *c, unsigned long s)
{
s1=s2=s3=s;
}

Luis Carvalho

unread,
Oct 22, 2010, 5:55:43 PM10/22/10
to lua...@googlegroups.com
> Os n�meros de Lua s�o double, com matissa de 53 bits. Assim, "value"
> retorna um n�mero entre 0 e 1 com todos os bits da mantissa aleat�rios.

Sim, mas por essa logica o math.random tambem deveria ter 53 bits de
resolucao, nao? Alem disso, para gerar 53 bits o MT executa genrand_int32 duas
vezes, ou seja, sao gerados 64 bits aleatorios.

> Al�m disso, genrand_res53 faz parte do c�digo original de random.c.

O genrand_real2 tambem. O R (http://www.r-project.org) usa algo equivalente ao
genrand_real3 (na verdade o genrand_real2 e' usado, mas um ajuste para que o
numero esteja em (0,1)). O Octave (http://www.gnu.org/software/octave) nao usa
o MT, mas o gerador deles tem 32 bits de resolucao. Ambos projetos usam a
ranlib ( para gerar numeros de outras distribuicoes (beta, gamma, normal, etc),
e a ranlib usa 32 bits mesmo em precisao dupla.

Agora voltando a Lua: por que math.random usa rand() e nao random()?
Portabilidade? Na man page do rand ha' o seguinte comentario:

"The versions of rand() and srand() in the Linux C Library use the same
random number generator as random(3) and srandom(3), so the lower-order
bits should be as random as the higher-order bits. However, on older
rand() implementations, and on current implementations on different
systems, the lower-order bits are much less random than the higher-
order bits. Do not use this function in applications intended to be
portable when good randomness is needed. (Use random(3) instead.)"

Abracos,

Luiz Henrique de Figueiredo

unread,
Oct 22, 2010, 8:27:10 PM10/22/10
to lua...@googlegroups.com
> > Os n�meros de Lua s�o double, com matissa de 53 bits. Assim, "value"
> > retorna um n�mero entre 0 e 1 com todos os bits da mantissa aleat�rios.
>
> Sim, mas por essa logica o math.random tambem deveria ter 53 bits de
> resolucao, nao? Alem disso, para gerar 53 bits o MT executa genrand_int32 duas
> vezes, ou seja, sao gerados 64 bits aleatorios.

Vejo o seu ponto. Vou ver se numa pr�xima vers�o de lrandom ponho isso
configur�vel.



> Agora voltando a Lua: por que math.random usa rand() e nao random()?
> Portabilidade? Na man page do rand ha' o seguinte comentario:

Pela raz�o de sempre: random n�o � ANSI C. Al�m disso, rand em Linux �
t�o bom quanto random, como diz na man page, de modo que n�o h� por que
temer usar math.random as is.

Luis Carvalho

unread,
Oct 22, 2010, 8:31:50 PM10/22/10
to lua...@googlegroups.com

Ah, claro. Obrigado!

Falou,

Luiz Henrique de Figueiredo

unread,
Oct 22, 2010, 9:05:26 PM10/22/10
to lua...@googlegroups.com
> Vou ver se numa pr�xima vers�o de lrandom ponho isso configur�vel.

Feito. Veja http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/#lrandom

Elvio Gomes

unread,
Oct 22, 2010, 11:09:20 PM10/22/10
to lua...@googlegroups.com
Muito bacana!

Reply all
Reply to author
Forward
0 new messages