Lo que estoy tratando de hacer es generar algunos números aleatorios (no necesariamente de un solo dígito) como¿Por qué los dígitos 1, 2 y 3 aparecen con tanta frecuencia usando la función C rand()?
29106
7438
5646
4487
9374
28671
92
13941
25226
10076
y luego contar el número de dígitos consigo:
count[0] = 3 Percentage = 6.82
count[1] = 5 Percentage = 11.36
count[2] = 6 Percentage = 13.64
count[3] = 3 Percentage = 6.82
count[4] = 6 Percentage = 13.64
count[5] = 2 Percentage = 4.55
count[6] = 7 Percentage = 15.91
count[7] = 5 Percentage = 11.36
count[8] = 3 Percentage = 6.82
count[9] = 4 Percentage = 9.09
Este es el código que estoy usando:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
int i;
srand(time(NULL));
FILE* fp = fopen("random.txt", "w");
// for(i = 0; i < 10; i++)
for(i = 0; i < 1000000; i++)
fprintf(fp, "%d\n", rand());
fclose(fp);
int dummy;
long count[10] = {0,0,0,0,0,0,0,0,0,0};
fp = fopen("random.txt", "r");
while(!feof(fp)) {
fscanf(fp, "%1d", &dummy);
count[dummy]++;
}
fclose(fp);
long sum = 0;
for(i = 0; i < 10; i++)
sum += count[i];
for(i = 0; i < 10; i++)
printf("count[%d] = %7ld Percentage = %5.2f\n",
i, count[i], ((float)(100 * count[i])/sum));
}
Si genero una gran cantidad de números aleatorios (1000000), esto es el resultado me sale:
count[0] = 387432 Percentage = 8.31
count[1] = 728339 Percentage = 15.63
count[2] = 720880 Percentage = 15.47
count[3] = 475982 Percentage = 10.21
count[4] = 392678 Percentage = 8.43
count[5] = 392683 Percentage = 8.43
count[6] = 392456 Percentage = 8.42
count[7] = 391599 Percentage = 8.40
count[8] = 388795 Percentage = 8.34
count[9] = 389501 Percentage = 8.36
Tenga en cuenta que 1, 2 y 3 tienen demasiados golpes. He intentado ejecutar esto varias veces y cada vez obtengo resultados muy similares.
Estoy tratando de entender qué podría causar que 1, 2 y 3 aparezcan con mucha más frecuencia que cualquier otro dígito.
Tomando indicio de lo que Matt Joiner y Pascal Cuoq señalaron,
he cambiado el código para utilizar
for(i = 0; i < 1000000; i++)
fprintf(fp, "%04d\n", rand() % 10000);
// pretty prints 0
// generates numbers in range 0000 to 9999
y esto es lo que me pasa (resultados similares en múltiples carreras):
count[0] = 422947 Percentage = 10.57
count[1] = 423222 Percentage = 10.58
count[2] = 414699 Percentage = 10.37
count[3] = 391604 Percentage = 9.79
count[4] = 392640 Percentage = 9.82
count[5] = 392928 Percentage = 9.82
count[6] = 392737 Percentage = 9.82
count[7] = 392634 Percentage = 9.82
count[8] = 388238 Percentage = 9.71
count[9] = 388352 Percentage = 9.71
¿Cuál es la razón por la que 0, 1 y 2 son los preferidos?
Gracias a todos. Usando
int rand2(){
int num = rand();
return (num > 30000? rand2():num);
}
fprintf(fp, "%04d\n", rand2() % 10000);
consigo
count[0] = 399629 Percentage = 9.99
count[1] = 399897 Percentage = 10.00
count[2] = 400162 Percentage = 10.00
count[3] = 400412 Percentage = 10.01
count[4] = 399863 Percentage = 10.00
count[5] = 400756 Percentage = 10.02
count[6] = 399980 Percentage = 10.00
count[7] = 400055 Percentage = 10.00
count[8] = 399143 Percentage = 9.98
count[9] = 400104 Percentage = 10.00
'rand()% 10000' sigue siendo parcial: los números del 0 al 9999 cubren una rebanada uniformemente, 10000 a 19999 otros, ... y los números del 30000 al 32767 crean sesgo, suponiendo que 32767 es el límite de los rands de función () Estoy seguro de que existen preguntas sobre StackOverflow sobre cómo obtener un número uniformemente distribuido entre 0 y 9999. La solución más simple es descartar los números por encima de 30000 llamando de nuevo a rands(). –
Esta pregunta está vagamente relacionada, aunque complica el problema para que sea un ejercicio más interesante: http://stackoverflow.com/questions/137783/given-a-function-which-produces-a-random-integer-in- the-range-1-to-5-write-a-fun –
¿Entonces solo usa el "conteo de dígitos" como * verificación * para ver si su generador de números aleatorios es "lo suficientemente aleatorio" (lo que sea que eso signifique)? Como muchos han respondido aquí, eso no es necesariamente un buen control, ya que algunos rangos de números tienen diferentes ocurrencias de ciertos dígitos. ¿O tienes alguna razón específica para querer una distribución pareja de dígitos? – BradC