Quello che sto cercando di fare è di generare alcuni numeri casuali (non necessariamente singola cifra) comePerché le cifre 1, 2 e 3 appaiono così frequentemente usando la funzione C rand()?
29106
7438
5646
4487
9374
28671
92
13941
25226
10076
e poi contare il numero di cifre ottengo:
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
Questo è il codice che ho sto 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));
}
Se ho generare un gran numero di numeri casuali (1000000), questo è il risultato che ottengo:
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
Si noti che 1, 2 e 3 hanno troppi riscontri. Ho provato a farlo più volte e ogni volta ottengo risultati molto simili.
Sto cercando di capire cosa potrebbe causare 1, 2 e 3 ad apparire molto più frequentemente di qualsiasi altra cifra.
Prendendo spunto da ciò che Matt Joiner e Pascal Cuoq sottolineato,
ho cambiato il codice per utilizzare
for(i = 0; i < 1000000; i++)
fprintf(fp, "%04d\n", rand() % 10000);
// pretty prints 0
// generates numbers in range 0000 to 9999
e questo è quello che ottengo (risultati analoghi su più piste):
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
Quale può essere il motivo per cui 0, 1 e 2 sono preferiti?
Grazie a tutti. Utilizzando
int rand2(){
int num = rand();
return (num > 30000? rand2():num);
}
fprintf(fp, "%04d\n", rand2() % 10000);
ottengo
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' è ancora polarizzato: i numeri da 0 a 9999 coprono una porzione in modo uniforme, da 10000 a 19999 l'altra, ... ei numeri da 30000 a 32767 creano distorsioni - presupponendo che 32767 è il limite dei rands delle funzioni (). Sono sicuro che ci sono già domande su StackOverflow su come ottenere un numero uniformemente distribuito tra 0 e 9999. La soluzione più semplice è quella di scartare i numeri superiori a 30000 chiamando di nuovo rands(). –
Questa domanda è vagamente correlata, sebbene complichi il problema rendendolo un esercizio più interessante: http://stackoverflow.com/questions/137783/given-a-function-which-produces-a-random-integer-in- the-range-1-to-5-write-a-fun –
Quindi stai usando il "numero di cifre" come * check * per vedere se il tuo generatore di numeri casuali è "abbastanza casuale" (qualunque cosa significhi)? Come molti hanno risposto qui, questo non è necessariamente un buon controllo, in quanto alcuni intervalli di numeri hanno diverse occorrenze di determinate cifre. O hai qualche motivo specifico per volere una distribuzione uniforme di cifre? – BradC