Inspiriert von Random mit gebundenen Händen :
Das Ziel
Ziel dieser Herausforderung ist es, ein Programm zu schreiben, das einen pseudozufälligen Bitstrom generiert. Dabei handelt es sich um eine Folge von Einsen und Nullen, die rein zufällig zu sein scheint, aber tatsächlich deterministisch generiert wird. Ihr Programm sollte eine Zeichenfolge von 1 und 0 (mit optionalem Leerzeichen) ausgeben und die folgenden Anforderungen erfüllen:
- Angesichts der unbegrenzten Zeit und des unbegrenzten Speichers muss Ihr Programm für immer eine Zeichenfolge von 1 und 0 ausgeben
- Ihr Programm muss auf einem vernünftigen Computer in etwa einer Minute mehr als 1000 zufällige Bits ausgeben. Wenn diese Anforderung nicht möglich ist, werde ich sie verringern.
- Die Bitfolge kann sich wiederholen, die Länge des Wiederholungsabschnitts muss jedoch mehr als 1000 Bit betragen.
- Die Bitfolge muss so viele Zufallstests wie möglich bestehen (siehe unten).
- Das Programm darf keine Eingaben von externen Quellen entgegennehmen oder eine integrierte rand () - ähnliche Funktion verwenden.
- Aufgrund der obigen Anforderung muss das Programm bei jeder Ausführung genau dieselbe Bitfolge ausgeben.
Zufallstest # 1
Die Folge von Pseudozufallsbits darf bei der Sichtprüfung kein offensichtliches Muster enthalten.
Zufallstest # 2 (Änderungen aufgrund von Kommentaren vorbehalten)
Die Bitfolge muss eine Gleichverteilung von 1 und 0 enthalten. Um dies (und auch andere Dinge) zu testen, wird der Bitstrom in Segmente unterteilt, die 3 Bits lang sind, wie z 101|111|001
.
Von all diesen Segmenten sollten 1/8 drei Einsen und keine Nullen haben, 3/8 sollten zwei Einsen und eine 0 haben, 3/8 sollten eine 1 und zwei Nullen haben und 1/8 von ihnen sollten keine Einsen und drei Nullen haben.
Zufallstest # 3
Ein "Durchlauf" ist definiert als eine aufeinanderfolgende Reihe von Bits, die alle den gleichen Wert haben. Die Saite 1001001110
hat drei Läufe der Größe 1 ( 1..1.....0
), zwei Läufe der Größe 2 ( .00.00....
) und einen Lauf der Größe 3 ( ......111.
). Beachten Sie, dass Läufe nicht überlappen.
Aus einer Folge von 1000 zufälligen Bits sollten ungefähr 250 Läufe der Größe 1, 125 Läufe der Größe 2, 62 Läufe der Größe 3 usw. bestehen. Im Allgemeinen sollten für Laufgröße R ungefähr 1000/(2**(R+1))
Läufe dieser Größe vorhanden sein.
Zufallstest # 4
Die ersten 840 Bits sind in zwei Hälften von jeweils 420 Bits aufgeteilt. Jedes Bit in der ersten Hälfte wird mit dem entsprechenden Bit in der zweiten Hälfte verglichen. Die beiden Bits sollten in etwa fünfzig Prozent der Fälle übereinstimmen.
Hier ist der Quellcode eines Perl-Programms, das die Tests 2 bis 4 ausführt. Ab sofort muss die Bitfolge kein Leerzeichen enthalten.
Zeit für das Zielgewinnkriterium!
Der Gewinner ist das Programm, das alle 6 Anforderungen und alle Zufälligkeitstests in einem von der Zufälligkeit nicht unterscheidbaren Maße besteht. Wenn dies mit mehreren Programmen erreicht wird, gewinnt das Programm, dessen Wiederholung am längsten dauert. Wenn dies mit mehreren Programmen erreicht wird, muss ich möglicherweise mehr Zufallstests finden, um als "Tie-Breaker" zu fungieren.