Wird dies zu Verzerrungen bei Zufallszahlen führen?

11

Angenommen, eine Datendatei mit mehr als 80 Millionen Einsen und Nullen wird zufällig generiert.

Aus dieser Datei möchten wir eine Liste von zufälligen Dezimalzahlen erstellen.

Dies ist der Plan für diese Konvertierung.

  1. Teilen Sie die 80 Millionen Ziffern in Gruppen von 4 Binärziffern ein.
  2. Konvertieren Sie jede 4-stellige Binärdatei in eine Dezimalzahl.
  3. Verwerfen Sie alle Dezimalwerte größer als 9.

Dies sollte zu einer Folge von zufälligen ganzen Zahlen von 0 bis 9 führen

Hier ist die Sorge. Die 24 Binärziffern, die die 6 Gruppierungen von 4 Binärziffern umfassen, die den Werten 10 bis 15 entsprechen, enthalten 17 Einsen und nur 7 Nullen. Wird dieses Ungleichgewicht die Verteilung von geraden und ungeraden ganzen Zahlen beeinflussen oder die Zufälligkeit der letzten Folge von Dezimalstellen in irgendeiner Weise beeinträchtigen?

Update: Aus den Antworten geht hervor, dass die oben aufgezählte Methode solide ist. Ich stimme dieser Schlussfolgerung zu. Ich verstehe jedoch immer noch nicht, warum das Entfernen von mehr als doppelt so vielen Einsen wie Nullen aus der Binärzeichenfolge das Ergebnis nicht auf weniger ungerade Zahlen ausrichtet. Ich suche Erklärungen.

Joel W.
quelle
9
Es gibt effizientere Methoden. Sie können beispielsweise die Bitfolge in Zehnergruppen aufteilen, sie in ihre dreistellige Darstellung Basis 10 konvertieren und alle mit Werten von 1000 oder mehr verwerfen. Dies würde 97,6% der Bits anstatt nur 62,5% von ihnen verwenden. Besser geht es nicht. (Sie könnten Gruppen von 681 verwenden und sie in 205-stellige Basis-10-Zeichenfolgen konvertieren, wodurch fast 99,7% der Bits verwendet werden.)
whuber

Antworten:

18

Lass uns zählen und sehen. Durch die Erstellung der Datei sind alle 4-Bit-Zeichenfolgen gleich wahrscheinlich. Es gibt 16 solcher Zeichenfolgen. Hier sind sie:

 0. 0000
 1. 0001
 2. 0010
 3. 0011
 4. 0100
 5. 0101
 6. 0110
 7. 0111
 8. 1000
 9. 1001
10. 1010
11. 1011
12. 1100
13. 1101
14. 1110
15. 1111

Ihre Prozedur wirft die Zeichenfolgen 10 bis 15 aus. In den Fällen, die Sie tatsächlich verwenden, wählen Sie 0 bis 9, von denen jede wie gewünscht gleich wahrscheinlich ist. Und wir wissen, dass die generierten Dezimalstellen unabhängig voneinander sind, da jede eine separate Zeichenfolge von 4 Bits verwendet und alle Bits unabhängig sind. Ihr Verfahren stellt eine einfache Art der Ablehnungsstichprobe dar .

Kodiologe
quelle
5
Ich sehe diese Logik klar. Ich mache mir jedoch Sorgen, dass ich mehr binäre Einsen als Nullen verwerfe. Warum hat dieses Ungleichgewicht keine Auswirkungen?
Joel W.
5
@ JoelW Ich glaube, ich sehe dein Argument nicht. Die endgültige Verteilung betrifft Dezimalstellen, keine Bits, daher ist die Verteilung der Bits irrelevant.
Kodiologe
7
Dies ist richtig, geht aber nur teilweise auf die Frage ein. Um den Teil der Frage "Kompromiss-Zufälligkeit ... in irgendeiner Weise" anzusprechen, muss man auch feststellen, dass die resultierenden Dezimalstellen in ausgezeichneter Näherung unabhängig sind . Der Vollständigkeit halber lohnt es sich, diesem (offensichtlichen) Ergebnis einen Erklärungssatz zu widmen.
whuber
7
Joel, ich sehe, woher du kommst. Hier kann es zu einer falschen Wahrnehmung kommen: Sie können den Vorgang nicht umkehren. Wenn Sie einen Bitstrom aus dem Strom von Dezimalstellen rekonstruieren möchten, müssen Sie beispielsweise alle 8er und 9er löschen und die verbleibenden Ziffern in binäre Tripel konvertieren. Das wird das Gleichgewicht wiederherstellen. Tatsächlich ist es leicht zu erkennen, dass diese "Rundreise" dazu führt, dass Ihr ursprünglicher Stream in Vier-Bit-Nybbles zerlegt und die wichtigsten Bits verworfen werden, wodurch eine schöne, gleichmäßig verteilte Folge von 60 Millionen Bits entsteht.
whuber
1
@whuber Fair genug; hinzugefügt.
Kodiologe
4

Es gibt keine Verzerrung, da Sie nur einige verworfene Werte simulieren und alle Werte, einschließlich der beibehaltenen, mit der gleichen Wahrscheinlichkeit generiert werden: Geben Sie hier die Bildbeschreibung ein

Der R-Code für das obige Diagramm lautet

generza=matrix(sample(0:1,4*1e6,rep=TRUE),ncol=4)
uniz=generza[,1]+2*generza[,2]+4*generza[,3]+8*generza[,4]
barplot(hist(uniz[uniz<10],breaks=seq(-0.5,9.5,le=11))$counts,col="steelblue")
Xi'an
quelle