Ispirato da Random con le mani legate :
L'obiettivo. il gol
L'obiettivo di questa sfida è scrivere un programma che generi un flusso di bit pseudocasuale, che è una stringa di 1 e 0 che sembra essere puramente casuale, ma che in realtà è generato in modo deterministico. Il tuo programma dovrebbe generare una stringa di 1 e 0 (con spazi bianchi opzionali) e dovrebbe soddisfare i seguenti requisiti:
- Con tempo e memoria illimitati, il programma deve continuare a emettere una stringa di 1 e 0 per sempre
- Il tuo programma deve emettere più di 1000 bit casuali in circa un minuto, su una macchina ragionevole. Se questo requisito è impossibile, lo diminuirò.
- La stringa di bit può essere ripetuta, ma la lunghezza della sezione ripetuta deve essere superiore a 1000 bit.
- La stringa di bit deve superare il maggior numero possibile di test di casualità (descritti di seguito).
- Il programma non deve ricevere alcun input da alcuna fonte esterna o utilizzare alcuna funzione simile a rand ().
- A causa dei requisiti di cui sopra, il programma deve generare la stessa stringa esatta di bit ogni volta che viene eseguito.
Test di casualità n. 1
La stringa di bit pseudocasuali non deve includere alcun modello evidente durante l'ispezione visiva.
Test di casualità n. 2 (soggetto a modifiche in base ai commenti)
La stringa di bit deve contenere una distribuzione uguale di 1 e 0 secondi. Per testare questo (e anche altre cose), il flusso di bit è suddiviso in segmenti lunghi 3 bit, come ad esempio 101|111|001
.
Di tutti questi segmenti, 1/8 di essi dovrebbero avere tre 1 e nessun 0, 3/8 di essi dovrebbero avere due 1 e uno 0, 3/8 di loro dovrebbero avere 1 e due 0 e 1/8 di loro non dovrebbero avere 1 e tre 0.
Test di casualità n. 3
Una "corsa" è definita come una serie consecutiva di bit che hanno tutti lo stesso valore. La stringa 1001001110
ha tre serie di dimensioni 1 ( 1..1.....0
), due serie di dimensioni 2 ( .00.00....
) e una serie di dimensioni 3 ( ......111.
). Si noti che le esecuzioni non si sovrappongono.
Di una stringa di 1000 bit casuali, dovrebbero esserci circa 250 serie di dimensioni 1, 125 serie di dimensioni 2, 62 serie di dimensioni 3, ecc. In generale, per dimensioni di serie R, dovrebbero esserci 1000/(2**(R+1))
righe di tali dimensioni.
Test di casualità n. 4
I primi 840 bit sono divisi in due metà di 420 bit ciascuno. Ogni bit nella prima metà viene confrontato con il bit corrispondente nella seconda metà. I due bit dovrebbero corrispondere al 50% circa delle volte.
Ecco il codice sorgente di un programma Perl che esegue i test da 2 a 4. A partire da ora, richiede che la stringa di bit non contenga spazi bianchi.
Tempo di criterio vincente obiettivo!
Il vincitore è il programma che supera tutti e 6 i requisiti e tutti i test di casualità nella misura in cui è indistinguibile dalla casualità. Se più programmi compiono questo, allora vincerà quello che impiega più tempo per ripetersi. Se più programmi compiono questo, allora potrei dover trovare altri test di casualità per agire come tie-breaker.