Test di algoritmi di generazione di variabili casuali


Risposte:


9

La suite di test Diehard è simile a uno standard d'oro per il test di generatori di numeri casuali. Comprende una serie di test in cui un buon generatore di numeri casuali dovrebbe produrre risultati distribuiti secondo una distribuzione nota rispetto alla quale è quindi possibile confrontare i risultati utilizzando il generatore testato.

MODIFICARE

Devo aggiornare questo dato che non avevo esattamente ragione: Diehard potrebbe ancora essere usato molto, ma non è più mantenuto e non è più all'avanguardia. Da allora il NIST ha messo a punto una serie di test migliorati .


9

Giusto per aggiungere un po 'alla risposta di honk, la Diehard Test Suite (sviluppata da George Marsaglia) sono i test standard per PRNG.

C'è una bella libreria Diehard C che ti dà accesso a questi test. Oltre ai test standard Diehard, fornisce anche alcune funzioni per alcuni altri test PRNG che coinvolgono (tra le altre cose) il controllo dell'ordine dei bit. C'è anche una facilità per testare la velocità dell'RNG e scrivere i propri test.

Esiste un'interfaccia R per la libreria Dieharder, chiamata RDieHarder :

library(RDieHarder)
dhtest = dieharder(rng="randu", test=10, psamples=100, seed=12345)
print(dhtest)

Diehard Count the 1s Test (byte)

       data:  Created by RNG `randu' with seed=12345, 
              sample of size 100 p-value < 2.2e-16

Ciò dimostra che il generatore RANDU RNG non supera il test della distanza minima / 2dsfera.


8

Per testare i numeri prodotti da generatori di numeri casuali i test di Diehard sono un approccio pratico. Ma quei test sembrano in qualche modo arbitrari e ci si può chiedere se si debba includere altro o se c'è un modo per verificare realmente la casualità.

Il miglior candidato per la definizione di una sequenza casuale sembra essere la casualità di Martin-Löf . L'idea principale per questo tipo di casualità, magnificamente sviluppata in Knuth, sezione 3.5 , è quella di verificare l'uniformità per tutti i tipi di sotto-sequenze della sequenza di numeri casuali. Ottenere che tutti i tipi di definizione delle sottosequenze si siano rivelati davvero difficili anche quando si usano nozioni di calcolabilità.

I test di Diehard sono solo alcune delle possibili sottosequenze che si possono prendere in considerazione e il loro fallimento escluderebbe la casualità di Martin-Löf.


4

Non puoi provare, perché è impossibile; puoi solo verificare se non ci sono imbarazzanti autocorrelazioni o disturbi della distribuzione, e infatti Diehard è uno standard per questo. Questo è per la statistica / fisica, i crittografi controlleranno anche (tra le altre cose) quanto sia difficile adattare il generatore ai dati per ottenere i valori futuri.


4

Piccola correzione al post di Colin: il pacchetto CRAN RDieHarder è un'interfaccia per DieHarder , la riscrittura / estensione / revisione di Diehard fatta da Robert G. Brown (che gentilmente mi elenca come coautore basato sui miei wrapper RDieHarder) con il recente contributo di David Bauer.

Tra le altre cose, DieHarder include la batteria di test NIST menzionata nel post di Mark e alcuni nuovi. Questa è una ricerca in corso ed è stata per un po '. Ho tenuto un discorso su useR! 2007 su RDieHarder che puoi ottenere da qui .


3

Raramente è utile concludere che qualcosa è "casuale" in astratto. Più spesso vuoi testare se ha un certo tipo di struttura casuale. Ad esempio, potresti voler verificare se qualcosa ha una distribuzione uniforme, con tutti i valori in un certo intervallo ugualmente probabili. Oppure potresti voler verificare se qualcosa ha una distribuzione normale, ecc. Per verificare se i dati hanno una distribuzione particolare, puoi utilizzare un test di bontà di adattamento come il test chi quadrato o il test Kolmogorov-Smirnov.


3

Esistono due parti per testare un generatore di numeri casuali. Se ti preoccupi solo di testare un generatore uniforme, allora sì, qualcosa come la suite di test DIEHARD è una buona idea.

Ma spesso è necessario testare una trasformazione di un generatore uniforme. Ad esempio, è possibile utilizzare un generatore uniforme per creare valori distribuiti in modo esponenziale o normalmente. Potresti avere un generatore uniforme di alta qualità - supponiamo che tu abbia un'implementazione affidabile di un noto algoritmo come Mersenne Twister - ma devi testare se l'output trasformato ha la giusta distribuzione. In tal caso è necessario eseguire una sorta di test di idoneità come Kolmogorov-Smirnov. Ma per cominciare, potresti verificare che la media e la varianza del campione abbiano i valori che ti aspetti.

La maggior parte delle persone non - e non dovrebbe - scrivere da zero il proprio generatore di numeri casuali uniforme. È difficile scrivere un buon generatore ed è facile ingannare se stessi pensando di averne scritto uno buono quando no. Ad esempio, Donald Knuth racconta la storia nel volume TAOCP 2 di un generatore di numeri casuali che ha scritto che si è rivelato terribile. Ma è comune che le persone debbano scrivere il proprio codice per produrre valori casuali da una nuova distribuzione.


2

Il NIST pubblica un elenco di test statistici con un'implementazione di riferimento in C.

C'è anche TestU01 da parte di alcune persone intelligenti, tra cui il rispettato ricercatore PRNG Pierre L'Ecuyer. Ancora una volta, c'è un'implementazione di riferimento in C.

Come sottolineato da altri commentatori, questi sono per testare la generazione di bit pseudo casuali. Se trasformi questi bit in una variabile casuale diversa (ad esempio la trasformazione da Box-Muller da uniforme a Normale), avrai bisogno di ulteriori test per confermare la correttezza dell'algoritmo di trasformazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.