Inspiré par Random avec les mains liées :
Le but
Le but de ce défi est d'écrire un programme qui génère un flux binaire pseudo-aléatoire, qui est une chaîne de 1 et de 0 qui semble être purement aléatoire, mais qui est en fait généré de manière déterministe. Votre programme doit générer une chaîne de 1 et 0 (avec des espaces en option) et doit répondre aux exigences suivantes:
- Étant donné le temps et la mémoire illimités, votre programme doit continuer à produire une chaîne de 1 et de 0 pour toujours
- Votre programme doit produire plus de 1000 bits aléatoires en une minute environ, sur une machine raisonnable. Si cette exigence est impossible, je la diminuerai.
- La chaîne de bits peut se répéter, mais la longueur de la section extensible doit être supérieure à 1 000 bits.
- La chaîne de bits doit réussir autant de tests d'aléatoire (décrits ci-dessous) que possible.
- Le programme ne doit prendre aucune entrée d'aucune source externe ni utiliser aucune fonction de type rand () intégrée.
- En raison de l'exigence ci-dessus, le programme doit générer la même chaîne de bits exacte à chaque exécution.
Test de hasard # 1
La chaîne de bits pseudo-aléatoires ne doit pas inclure de motif évident lors de l'inspection visuelle.
Test de hasard # 2 (sujet à changement en fonction des commentaires)
La chaîne de bits doit contenir une distribution égale de 1 et de 0. Pour tester cela (et d'autres choses aussi), le flux de bits est divisé en segments de 3 bits, tels que 101|111|001
.
De tous ces segments, 1/8 d'entre eux devraient avoir trois 1 et aucun 0, 3/8 d'entre eux devraient avoir deux 1 et un 0, 3/8 d'entre eux devraient avoir un 1 et deux 0 et 1/8 d'entre eux ne devraient pas avoir de 1 et trois 0.
Test de hasard # 3
Une «exécution» est définie comme une série consécutive de bits qui ont tous la même valeur. La chaîne 1001001110
a trois exécutions de taille 1 ( 1..1.....0
), deux exécutions de taille 2 ( .00.00....
) et une exécution de taille 3 ( ......111.
). Notez que les exécutions ne se chevauchent pas.
Sur une chaîne de 1000 bits aléatoires, il devrait y avoir environ 250 exécutions de taille 1, 125 exécutions de taille 2, 62 exécutions de taille 3, etc. En général, pour la taille d'exécution R, il devrait y avoir environ des 1000/(2**(R+1))
exécutions de cette taille.
Test de hasard # 4
Les 840 premiers bits sont divisés en deux moitiés de 420 bits chacune. Chaque bit de la première moitié est comparé au bit correspondant de la seconde moitié. Les deux bits doivent correspondre à environ cinquante pour cent du temps.
Voici le code source d'un programme Perl qui effectue les tests 2 à 4. Pour l'instant, il requiert que la chaîne de bits ne contienne aucun espace.
Temps de critère de gain objectif!
Le gagnant est le programme qui réussit toutes les 6 exigences et tous les tests de hasard dans la mesure où il est impossible de le distinguer du hasard. Si plusieurs programmes accomplissent cela, alors celui qui prend le plus de temps à répéter gagnera. Si plusieurs programmes accomplissent cela, je devrai peut-être trouver plus de tests d'aléatoire pour agir en tant que bris d'égalité.