Domanda

Sto scrivendo un programma che scrivere test statistici a Delfi (deve essere Delphi) e ho sentito che la funzionalità a caso è un po 'strano. Dovete chiamare randomize per randomizzare il seme della funzione random all'avvio del programma.

Mi chiedo se la funzione random (dopo la chiamata Randomize) è abbastanza casuale per test statistici o un Mersenne Twister è necessaria? Qualcuno ha qualche comprensione effettiva implementazione di casuale, che può dirmi come questo sia importante?

È stato utile?

Soluzione

Sia Random è sufficientemente affidabile per i test statistici dipendono dal contesto in cui si intende utilizzarlo.

Detto questo, ho scritto diversi pezzi di codice Delphi che hanno bisogno di fare statistiche adeguate, e hanno utilizzato Random esempio per ottenere varie distribuzioni nulli, dati pseudo-repliche e resamplings. Finora, non ho incontrato ogni caso nel mio codice in cui Random avrebbe prodotto tendenziose o risultati inaffidabili, o risultati, che avrebbe impedito il suo utilizzo per il previsto test statistico. Ma ciò che vale per il mio codice non deve necessariamente tenere per il vostro.

In caso di dubbio, si potrebbe naturalmente statisticamente analizzare i risultati delle chiamate a Random (ad esempio nel campo della R, SPSS, etc.) e verificare se la distribuzione dei risultati violare i requisiti distributivi per la vostra particolare test statistico (s). [Se sei uno scienziato corretta, questo è ciò che si dovrebbe fare comunque.]

Se avete bisogno di altri PRNGs - per esempio TPMath libreria contiene alcuni. (Per le cose più coinvolti, c'è anche la possibilità di chiamare funzioni statistiche elaborate da R via Delphi.)

Altri suggerimenti

di Delphi PRNG, come quasi tutti PRNGs RTL linguaggio di programmazione, è un lineare congruenziale generatore .

E 'abbastanza buono per la maggior parte delle cose su piccola scala, ma ci sono cose a cui prestare attenzione. In particolare, attenzione per bit meno: il modello di moltiplicazione e aggiungere mezzi che i bit di ordine inferiore non sono molto casuale affatto. Ma questo vale in genere solo a grandi valori a 32 bit tirato fuori e quindi troncati con mod o simili. Utilizzando Random(10) cogliere un valore compreso tra 0 e 9 utilizza internamente una moltiplicazione sull'intero intervallo di 32 bit anziché un'operazione mod.

alt text

Non ho potuto resistere.

Se siete in cerca di un modo per garantire l'unicità di numeri casuali con il tempo di esecuzione più veloce, About.com ha creato fallo su più veloce unico generatore di numeri casuali, e di Patrick van Logchem implementazione è stato eletto come il vincitore.

A meno che non si acquista un po 'di hardware relativamente esoterica, la migliore approssimazione a numeri casuali di un computer in grado di fornire è una sequenza pseudocasuale completamente deterministica. In generale, la funzione Randomize utilizza un valore relativamente casuale (spesso in base al tempo, ma a volte sui movimenti del mouse - non ho idea di quello che Delphi fa) come un seme che fornisce il punto di ingresso alla sequenza pseudocasuale. Senza questo, si finirà per tornare lo stesso insieme di numeri casuali nello stesso ordine ogni volta, che tende a sconfiggere lo scopo di utilizzare numeri casuali, in primo luogo.

Va bene, mi rendo conto che questo non risponde alla domanda circa l'affidabilità, ma dovrebbe dare una certa sicurezza che richiedono di chiamare Randomize è un segno di un generatore di bene piuttosto che di uno cattivo. Ci sono una serie di test statistici che mostrano come casuale una sequenza di numeri è, ed è probabile che il generatore di numeri casuali Delphi è adatto per molti scopi in quanto è un prodotto maturo.

Giusto per aggiungere al pool di possibilità - Windows offre una vasta gamma di built-in funzioni di crittografia . Probabilmente v'è un wrapper Delphi per loro, se non è già incluso di default.

Tra queste funzioni è anche un caso crittografia forte numero generatore . Questo è di gran lunga il miglior casualità si otterrà nel software, perchè i semi si basa su una lunga lista di fattori. Non sono sicuro, ma ho il sospetto che sarà anche utilizzare un generatore di numeri casuali hardware se ne hai uno.

E se questo non bastasse, si può anche provare a iscriversi al Quantum caso Bit Generator servizio per alcuni VERAMENTE valori casuali.

Dal sito web Embarcadero:

_lrand è la funzione di generatore di numeri casuali lungo. _rand utilizza un generatore di numeri casuali congruential moltiplicativo con periodo 2 ^ 64 per tornare successivi numeri pseudo-casuali nell'intervallo da 0 a 2 ^ 31 - 1.

Il generatore viene reinizializzato chiamando srand con un valore di argomento di 1. Può essere impostato ad un nuovo punto di partenza chiamando srand con un dato numero di semi.

Se non cambiare l'implementazione in quanto ho analizzato esso (Delphi 4 IIRC), il Delphi PRNG è implementata in questo modo:

Randseed:=int32(Randseed*$08088405)+1
result:=Randseed*Range shr 32

(pseudocodice / assumere le moltiplicazioni sono arbitrariamente grandi numeri interi)

Return casuale tra 0..9

StrToInt(copy(FloatToStr(Random),4,1))

Nota: Controllare FloatToStr (casuale) di lunghezza prima dell'uso o utilizzare alcun altra cifra dalla parte decimale ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top