Números Aleatórios
Você já parou para pensar como um computador, ou um algoritmo (sequência de operações), é capaz de criar números aleatórios? Como algo completamente lógico consegue criar algo totalmente aleatório?
Existem duas formas de se obter números aleatórios. A primeira forma é utilizando algum mecanismo de medição de fenômenos naturais completamente aleatórios. Radiação, por exemplo. Utilizando um contador Geiger (medidor de radiação), pode-se medir o decaimento radioativo de algum material e, já que este processo é completamente aleatório, o contador conseguirá gerar números puramente aleatórios também.
Como você pode imaginar, este processo não é nada prático. Portanto, na indústria e de modo geral, utiliza-se outra abordagem para gerar números aleatórios.
Pode-se desenvolver uma fórmula geradora de números pseudoaleatórios. Isso significa uma fórmula que gere números aparentemente aleatórios para aqueles que não sabem a lógica da fórmula.
Uma boa fórmula possui as seguintes características:
- Sem repetição – para que a sequência numérica evite se repetir;
- Falta de previsibilidade – impossibilidade de prever o próximo número, a menos que se saiba a lógica da fórmula;
- Boa distribuição – se tivermos números aleatórios de 0 a 100, o número de 0s será parecido com o de 1s e 2s e assim sucessivamente, até 100, em um longo período de tempo.
É importante notar que toda fórmula de geração de números aleatórios depende de uma semente inicial. Semente é o número que será transformado pela fórmula em números aleatórios. Por exemplo, observe o procedimento abaixo:
número_aleatório = 7 * semente mod(11)
Pode parecer complicado, mas o procedimento é bem simples: escolha a semente, multiplique por 7 e encontre o resto da divisão por 11 deste número (a função “mod” representa “resto da divisão por”). Depois, basta utilizar o resultado obtido como uma nova semente. Vamos analisar o exemplo para entender melhor. Supondo que a semente inicial seja 2:
número_aleatório = 7 * 2 mod(11)
número_aleatório = 14 mod(11)
número aleatório = 3
Como 14 dividido por 11 é igual a 1, o resto da divisão é 3. É justamente ele que queremos.
A partir desta primeira iteração, geramos um número aleatório (3) a partir de uma semente (2). Podemos continuar o procedimento para obter uma sequência de números, utilizando sempre o resultado anterior como semente do próximo:
número_aleatório = 7 * 3 mod(11)
número_aleatório = 21 mod (11)
número_aleatório = 10
No exemplo acima, 21 dividido por 11 é igual a 1 e o resto é 10. Faremos mais uma vez, agora utilizando 10 como semente:
número_aleatório = 7 * 10 mod(11)
número_aleatório = 70 mod(11)
número_aleatório = 4
Neste exemplo, 70 dividido por 11 dá 6 e o resto da divisão é 4. Portanto, obtivemos a seguinte sequência inicial:
2, 3, 10, 4
Observe que a sequência mudaria completamente se tivéssemos começado com outra semente. Observe, também, que este algoritmo gera números aleatórios de 0 a 10 apenas, já que utiliza o resto da divisão por 11 (que, por definição, é no máximo 10).
Uma última observação interessante é a seguinte: dependendo da lógica de construção da sequência de números aleatórios que foi utilizada, basta saber a regra (ou fórmula) e a semente inicial para que se consiga reproduzir toda a sequência gerada.
Isso é extremamente importante em casos corporativos. Por exemplo: uma empresa utiliza determinada regra “aleatória” para sortear clientes. Algum cliente processa a empresa afirmando que o processo é enviesado, e que na verdade a empresa de certa forma escolhe os números. Neste contexto, é fundamental que a empresa consiga demonstrar que os números são sim aleatórios (ou, no caso, pseudoaleatórios).
pessoal como funciona a jogo blaze das cores o numero inicial pode ser mudado alietoriamente tambem ou nao ?????
Cara, muito interessante seu post.
Sempre tentei entender como funcionava isso, sempre passava o olho rapidamente em algumas definições, mas nunca ficou muito claro.
Você descreveu perfeitamente o processo de seeds e tal. É bem simples, basta ter alguém que saiba explicar. Valeu!
Fico feliz que tenha ajudado. Obrigado pelo comentário! 🙂
Seu post me ajudou numa pesquisa de distribuição de números aleatórios, e na busca do melhor método de gera-los para uma rede neural.
Em C++ temos o random() e o rand(), mas os dois perderam em desempenho computacional para este simples método, que foi 2,3x mais rápido, com perfeita distribuição em todas as faixas de números.
Segue um pequeno source em C++ com a implementação do método:
#include
#include
#include
#include
double intmod, semente, numrnd;
int main(void)
{
time_t inicio; //define variavel tipo “long” adequada para time
time(&inicio); //pega os segundos do relogio do sistema
semente = inicio; //ao mover, converte tipo “long” para “double”
for (int n=0; n<20; n++) //vai gerar 20 numeros
{
numrnd = modf( semente * 7 / 11, &intmod ) + 0.1 ; //intmod tem que ser "double"
semente = numrnd * 11; // modf retorna resto em numero decimal
printf("Numero gerado %1.4f \n",numrnd);
};
}
Resultado:
Numero gerado 0.5545
Numero gerado 0.9818
Numero gerado 0.9727
Numero gerado 0.9091
Numero gerado 0.4637
Numero gerado 0.3462
Numero gerado 0.5233
Numero gerado 0.7630
Numero gerado 0.4408
Numero gerado 0.1856
Numero gerado 0.3995
Numero gerado 0.8966
Numero gerado 0.3764
Numero gerado 0.7346
Numero gerado 0.2420
Numero gerado 0.7942
Numero gerado 0.6596
Numero gerado 0.7174
Numero gerado 0.1216
Numero gerado 0.9514
eu que tenho 1 à 90 para a certar 5 números aleatórias sorteados
Eu sou de Moçambique, cá tem um jogo que chama lotto mas não sei como ganhar,sao 6 acertos de 1 a 49 e 1 número de bónus de 0 a 9, peço ideia para os sábios neste
Quero saber com fuciona os numero Leatorio,e com é esse sequemcia de numeros e com é feito.
se vc for programador é simples, aqui vai um exemplo em java:
StringBuilder sb = new StringBuilder();
int seed_inicial = VALORDESEJADO;
int prev = seed_inicial; //ESTA É SOMENTE PARA INICIALIZAÇÃO, POR QUE SER FOR
//NULO VAI DAR RUIM.
for(int i = 0; i < 60; i++) {
prev = (7 * prev) % 11;
sb.append(prev);
}
System.out.println(sb.toString());
Pronto com isso vc tem 60 números aleatórios quentinhos. Ah eles vao ficar todos juntos tipo: 02381239182310923810293. pra separar use sb.append(String.valueOf(prev) + " "); agora os números vao ficar separados 😉
no meu caso são 60 números como resolvo?