elgio
(usa OpenSuSE)
Enviado em 23/12/2009 - 07:45h
Acontece que como você está gerando números de 0 a 3 existe muita possibilidade de repetição. Além do mais o operador de resto não é a melhor forma de se gerar números aleatórios devido a sua previsibilidade. Com %4 você está, na verdade, isolando os últimos 2 bits do número (00 01 10 ou 11) e eles tendem a ser mesmos repetitivos. Serve para propósitos simples, mas são números VICIADOS!
Uma maneira mais randomica ainda é desta forma:
num = 1 + (int)( 4.0 * rand() / ( RAND_MAX + 1.0 ) );
Onde 4.0 é o máximo que queres (ou seja, valores de 1 a 4). Se queres de 1 a 3, remova o 1+ e troque o 4.0 por 3.0:
num = (int)( 3.0 * rand() / ( RAND_MAX + 1.0 ) );
Agora, nem mesmo com esta tecnica tu espera que não haja repetição em meros 4 números!! Pouca amostragem para teres alguma coisa. Fiz um teste aqui com valores de 0 a 1000 e com o sorteio de 10000 numeros e a distribuição foi satisfatória.
Com 10 mil gerações de 0 a 9 veja o que tive:
4 = 1049 ocorrencias
1 = 1031 ocorrencias
8 = 1029 ocorrencias
9 = 1021 ocorrencias
6 = 1005 ocorrencias
5 = 1005 ocorrencias
2 = 994 ocorrencias
0 = 984 ocorrencias
3 = 969 ocorrencias
7 = 913 ocorrencias
Bem distribuido, não?