Beachten Sie, dass 1, 2 und 3 zu viele Treffer haben. Ich habe versucht, dies mehrmals auszuführen, und jedes Mal erhalte ich sehr ähnliche Ergebnisse.
Ich versuche zu verstehen, was dazu führen könnte, dass 1, 2 und 3 viel häufiger erscheinen als jede andere Ziffer.
In Anlehnung an das, was Matt Joiner und Pascal Cuoq betonten,
Ich habe den zu verwendenden Code geändert
for(i = 0; i < 1000000; i++)
fprintf(fp, "%04d\n", rand() % 10000);
// pretty prints 0
// generates numbers in range 0000 to 9999
und das ist, was ich bekomme (ähnliche Ergebnisse bei mehreren Läufen):
rand() % 10000 ist immer noch voreingenommen: Zahlen von 0 bis 9999 decken ein Segment gleichmäßig ab, 10000 bis 19999 ein anderes, … und die Zahlen von 30000 bis 32767 erzeugen eine Verzerrung – vorausgesetzt, 32767 ist die Grenze Ihrer Funktion rands(). Ich bin sicher, dass es auf StackOverflow Fragen gibt, wie man eine gleichmäßig verteilte Zahl zwischen 0 und 9999 erhält. Die einfachste Lösung besteht darin, die Zahlen über 30000 zu verwerfen, indem man rands() erneut aufruft.
– Pascal Cuoq
1. August 2010 um 10:37 Uhr
Diese Frage ist vage verwandt, obwohl sie das Problem komplizierter macht, um es zu einer interessanteren Übung zu machen: stackoverflow.com/questions/137783/…
– Pascal Cuoq
1. August 2010 um 10:40 Uhr
Verwenden Sie also nur die “Ziffernanzahl” als a überprüfen um zu sehen, ob Ihr Zufallszahlengenerator “zufällig genug” ist (was auch immer das bedeutet)? Wie viele hier geantwortet haben, ist dies nicht unbedingt eine gute Überprüfung, da einige Zahlenbereiche unterschiedliche Vorkommen bestimmter Ziffern aufweisen. Oder haben Sie einen bestimmten Grund, warum Sie eine gleichmäßige Verteilung der Ziffern wünschen?
– BradC
5. August 2010 um 14:19 Uhr
@BradC: Kein bestimmter Grund. Habe irgendwo etwas über Zufallszahlen gelesen und beschlossen, dieses Programm zu schreiben.
– Möb
6. August 2010 um 5:16 Uhr
rand() generiert einen Wert aus 0 zu RAND_MAX. RAND_MAX ist eingestellt auf INT_MAX auf den meisten Plattformen, die sein können 32767 oder 2147483647.
Für Ihr oben angegebenes Beispiel scheint es so zu sein RAND_MAX ist 32767. Dies wird eine ungewöhnlich hohe Frequenz von platzieren 1, 2 und 3 für die höchstwertige Ziffer für die Werte von 10000 zu 32767. Sie können das in geringerem Maße beobachten, Werte bis zu 6 und 7 wird ebenfalls leicht begünstigt.
Warum sollten 6 und 7 leicht bevorzugt werden?
– AbdullahC
1. August 2010 um 9:35 Uhr
Denn für jede Zahl > 32700 kann die vierte Ziffer bis zu 6 sein. Für jede Zahl > 32760 kann die vierte Ziffer bis zu 7 sein.
– Wird A
1. August 2010 um 9:42 Uhr
Viel wichtiger ist, dass die Vorspannung für sechs und sieben die Vorspannung gegen null ist. 00012 ist hübsch gedruckt „12“, aber 11112 ist hübsch gedruckt „11112“. Alle führenden Nullen, die die Statistik ausgeglichen machen würden, wenn der Bereich eine Zehnerpotenz wäre, werden weggelassen printf.
– Pascal Cuoq
1. August 2010 um 9:54 Uhr
kennytm
In Bezug auf die bearbeitete Frage,
Das liegt daran, dass die Ziffern auch bei Ihnen noch nicht gleichmäßig verteilt sind % 10000. Davon ausgehen RAND_MAX == 32767und rand() ist vollkommen einheitlich.
Für jeweils 10.000 Zahlen, beginnend bei 0, erscheinen alle Ziffern einheitlich (jeweils 4.000). Allerdings ist 32.767 nicht durch 10.000 teilbar. Daher liefern diese 2.768 Zahlen mehr führende 0, 1 und 2 für die endgültige Zählung.
Wenn Sie 12.000 für die ersten 30.000 Zahlen zur Zählung hinzufügen und dann durch die Gesamtzahl der Ziffern (4 × 32.768) dividieren, sollten Sie die erwartete Verteilung erhalten:
Wenn Sie eine wirklich einheitliche Ziffernverteilung wünschen, müssen Sie dies tun ablehnen diese 2.768 Zahlen:
int rand_4digits() {
const int RAND_MAX_4_DIGITS = RAND_MAX - RAND_MAX % 10000;
int res;
do {
res = rand();
} while (res >= RAND_MAX_4_DIGITS);
return res % 10000;
}
Benfords Gesetz war auch mein erster Gedanke, aber gilt es nicht nur für “real-life” Daten, dh empirisch erhobene Daten?
– phimuemue
1. August 2010 um 9:35 Uhr
1,23 % der Statistiken entsprechen nicht dem Gesetz von Benford, außer am 3.12.2013. Entschuldigung – konnte nicht widerstehen. Ich glaube, dass dies tatsächlich nur für Daten aus dem wirklichen Leben gilt.
– Wird A
1. August 2010 um 9:40 Uhr
Das Benfordsche Gesetz erklärt die gleiche Beobachtung, aber nicht unter den gegebenen Umständen. Ich gehe von einer pseudozufälligen Gleichverteilung aus. Das Benfordsche Gesetz gilt für Verteilungen mit gleichmäßigen Logarithmen.
– Peter g.
1. August 2010 um 9:40 Uhr
Das liegt daran, dass Sie Zahlen zwischen generieren 0 und RAND_MAX. Die generierten Zahlen sind gleichmäßig verteilt (dh ungefähr gleiche Wahrscheinlichkeit für jede Zahl), jedoch kommen die Ziffern 1,2,3 häufiger vor als andere in diesem Bereich. Versuchen Sie, dazwischen zu generieren 0 und 10wobei jede Ziffer mit der gleichen Wahrscheinlichkeit vorkommt und Sie eine schöne Verteilung erhalten.
Wenn ich verstehe, was das OP (Person, die die Frage stellt) will, wollen sie bessere Zufallszahlen machen.
rand() und random() ergeben ehrlich gesagt keine sehr guten Zufallszahlen; beide schneiden schlecht ab, wenn sie gegen diehard und dieharder getestet werden (zwei Pakete zum Testen der Qualität von Zufallszahlen).
Der Mersenne-Twister ist ein beliebter Zufallszahlengenerator, der für so ziemlich alles gut ist, außer für kryptostarke Zufallszahlen; es besteht alle Diehard(er)-Tests mit Bravour.
Wenn man kryptostarke Zufallszahlen benötigt (Zahlen, die nicht erraten werden können, selbst wenn jemand weiß, welcher bestimmte kryptostarke Algorithmus verwendet wird), gibt es eine Reihe von Stream-Chiffren. Die, die ich gerne benutze, heißt RadioGatún[32]und hier ist eine kompakte C-Darstellung davon:
/*Placed in the public domain by Sam Trenholme*/
#include <stdint.h>
#include <stdio.h>
#define p uint32_t
#define f(a) for(c=0;c<a;c++)
#define n f(3){b[c*13]^=s[c];a[16+c]^=s[c];}k(a,b
k(p *a,p *b){p A[19],x,y,r,q[3],c,i;f(3){q[c]=b[c
*13+12];}for(i=12;i;i--){f(3){b[c*13+i]=b[c*13+i-
1];}}f(3){b[c*13]=q[c];}f(12){i=c+1+((c%3)*13);b[
i]^=a[c+1];}f(19){y=(c*7)%19;r=((c*c+c)/2)%32;x=a
[y]^(a[(y+1)%19]|(~a[(y+2)%19]));A[c]=(x>>r)|(x<<
(32-r));}f(19){a[c]=A[c]^A[(c+1)%19]^A[(c+4)%19];
}a[0]^=1;f(3){a[c+13]^=q[c];}}l(p *a,p *b,char *v
){p s[3],q,c,r,x,d=0;for(;;){f(3){s[c]=0;}for(r=0
;r<3;r++){for(q=0;q<4;q++){if(!(x=*v&255)){d=x=1;
}v++;s[r]|=x<<(q*8);if(d){n);return;}}}n);}}main(
int j,char **h){p a[39],b[39],c,e,g;if(j==2){f(39
){a[c]=b[c]=0;}l(a,b,h[1]);f(16){k(a,b);}f(4){k(a
,b);for(j=1;j<3;++j){g=a[j];for(e=4;e;e--){printf
("%02x",g&255);g>>=8;}}}printf("\n");}}
Es gibt auch viele andere wirklich gute Zufallszahlengeneratoren da draußen.
WARUM haben Menschen das Bedürfnis, Code in ein unlesbares 10 cm/Quadrat-Kästchen zu stopfen? Wenn Sie den Code so sehr hassen, dass Sie ihn lieber nicht lesen möchten, legen Sie ihn in eine eigene Datei und vergessen Sie ihn. Es ist, als würde man ein Kunstwerk malen und dann alles darüber pissen, wenn man fertig ist (es sei denn, dies war ein IOCCC-Kandidat …)
– Thomas
27. September 2013 um 6:39 Uhr
Verschiedene besser lesbare Versionen desselben Algorithmus sind verfügbar samiam.org/rg32
– Samam
24. Januar 2014 um 18:34 Uhr
el.pescado – нет войне
Wenn Sie einen Zufallswert aus dem Bereich generieren möchten [0, x), instead of doing rand()%x, you should apply formula x*((double)rand()/RAND_MAX), which will give you nicely distributed random values.
Say, RAND_MAX is equal to 15, so rand will give you integers from 0 to 15. When you use modulo operator to get random numbers from [0, 10), values [0,5] wird eine höhere Frequenz haben als [6,9]Weil 3 == 3%10 == 13%10.
WARUM haben Menschen das Bedürfnis, Code in ein unlesbares 10 cm/Quadrat-Kästchen zu stopfen? Wenn Sie den Code so sehr hassen, dass Sie ihn lieber nicht lesen möchten, legen Sie ihn in eine eigene Datei und vergessen Sie ihn. Es ist, als würde man ein Kunstwerk malen und dann alles darüber pissen, wenn man fertig ist (es sei denn, dies war ein IOCCC-Kandidat …)
– Thomas
27. September 2013 um 6:39 Uhr
Verschiedene besser lesbare Versionen desselben Algorithmus sind verfügbar samiam.org/rg32
– Samam
24. Januar 2014 um 18:34 Uhr
13696800cookie-checkWarum erscheinen die Ziffern 1, 2 und 3 so häufig mit der Funktion C rand()?yes
rand() % 10000
ist immer noch voreingenommen: Zahlen von 0 bis 9999 decken ein Segment gleichmäßig ab, 10000 bis 19999 ein anderes, … und die Zahlen von 30000 bis 32767 erzeugen eine Verzerrung – vorausgesetzt, 32767 ist die Grenze Ihrer Funktion rands(). Ich bin sicher, dass es auf StackOverflow Fragen gibt, wie man eine gleichmäßig verteilte Zahl zwischen 0 und 9999 erhält. Die einfachste Lösung besteht darin, die Zahlen über 30000 zu verwerfen, indem man rands() erneut aufruft.– Pascal Cuoq
1. August 2010 um 10:37 Uhr
Diese Frage ist vage verwandt, obwohl sie das Problem komplizierter macht, um es zu einer interessanteren Übung zu machen: stackoverflow.com/questions/137783/…
– Pascal Cuoq
1. August 2010 um 10:40 Uhr
Verwenden Sie also nur die “Ziffernanzahl” als a überprüfen um zu sehen, ob Ihr Zufallszahlengenerator “zufällig genug” ist (was auch immer das bedeutet)? Wie viele hier geantwortet haben, ist dies nicht unbedingt eine gute Überprüfung, da einige Zahlenbereiche unterschiedliche Vorkommen bestimmter Ziffern aufweisen. Oder haben Sie einen bestimmten Grund, warum Sie eine gleichmäßige Verteilung der Ziffern wünschen?
– BradC
5. August 2010 um 14:19 Uhr
@BradC: Kein bestimmter Grund. Habe irgendwo etwas über Zufallszahlen gelesen und beschlossen, dieses Programm zu schreiben.
– Möb
6. August 2010 um 5:16 Uhr