In realtà c'era un articolo davvero buono che ho letto abbastanza di recente su diversi tipi di PRNG e su come funzionano in termini di diversi test di casualità. Sfortunatamente, non riesco a trovarlo ora. L'essenza di ciò, tuttavia, era che i generatori di numeri casuali predefiniti in quasi tutti i linguaggi di programmazione popolari sono piuttosto ingenui e hanno pregiudizi piuttosto significativi.
Un'altra risposta indica già che nessun PRNG, a prescindere da quanto sofisticato sia l'algoritmo, è sufficiente per le applicazioni crittografiche. Questo è vero. Dal momento che dici che questo sarà usato per "selezionare un biglietto vincente", ignoriamolo per ora.
L'algoritmo di Knuth utilizzato dalla classe .NET System.Random
è ottimizzato principalmente per la velocità, non per la distribuzione casuale. È "abbastanza casuale" per molti scopi, che la maggior parte delle applicazioni non si allontanano mai troppo, ma nei campi di (a) gioco e (b) simulazione statistica, la maggior parte delle persone sembra pensare che sia una scelta sbagliata. È meglio degli LCG che erano il default nelle vecchie librerie, ma non si vuole ancora usarlo per qualcosa come un lotto.
Non fatevi ingannare dal pensare di utilizzare solo una fonte crittografica. Il problema con gli RNG crittografici è che riempiono un flusso di byte, ma trasformarli in un singolo numero casuale compreso tra x e y richiede che si esegua qualche aritmetica modulare (o arrotondamento, stesso risultato in entrambi i casi). E se la tua gamma casuale non si divide perfettamente in qualsiasi potenza di 2 è definita dalla lunghezza del byte, allora finirai con un pregiudizio nei numeri più bassi. I dati generati hanno un'alta entropia, ma il tuo risultato sarà distorto.
Come un semplice esempio, diciamo che ottieni un numero casuale "perfetto" da 1 a 10 e ora desideri trasformarlo in un numero casuale compreso tra 1 e 7. Come si fa? Il semplice calcolo di result % 7
sarà fortemente distorto verso i numeri 1-3. Ci sono alcuni modi per ridurre il bias quando si utilizza un RNG crittografico, ma il punto che sto cercando di fare è che gli RNG crittografici siano progettati per applicazioni crittografiche e l'utilizzo di uno di quelli per una simulazione Monte Carlo non è solitamente l'idea migliore.
Per quanto ne so, il PRNG "buono" più popolare oggi, utilizzato comunemente nelle applicazioni di gioco, è lo Mersenne Twister. C'è un .NET implementation here. Questo algoritmo supera tutti gli Diehard Tests per la distribuzione casuale; mostra quasi nessuna distorsione ed è una buona scelta quando si usano numeri casuali per applicazioni probabilistiche e statistiche.
La biblioteca scientifica GNU ha anche un numero di RNG algorithms e, non sorprendentemente, il Mersenne Twister è in cima alla lista.Tuttavia, alcuni degli altri valgono la pena di curiosare; RANLUX segna anche un buon punteggio nel test durissimo IIRC.
Eric ha ragione con il suo commento, naturalmente; tutte queste informazioni sono inutili se non hai requisiti tecnici specifici su "quanto casuale" hai bisogno che i tuoi numeri casuali siano. Sto usando una definizione che potrebbe essere applicabile a un'applicazione di gioco/gioco a impatto relativamente basso (cioè non un sito di gioco registrato con milioni di visitatori al giorno - ci sono regole più severe sulla casualità per quelli).
Definire in modo chiaro e preciso "il più possibile casuale". Per ottenere un segnale che sia in realtà "il più casuale possibile" hai bisogno di una fonte di entropia - il seme - che abbia più bit di entropia rispetto all'elemento casuale generato da quel seme. Quindi, se hai già una varietà di fonti di dati per il seme, e sono ad alta entropia, allora hai già finito. Estrai solo 24 bit dalla tua fonte di entropia, e questo ti dà un numero tra 0 e 16 milioni che è ** il più casuale possibile data la tua fonte di entropia **. –
Inoltre, sarebbe di grande aiuto se tu descrivessi per cosa userai questo numero casuale. –
Re: il tuo aggiornamento: ora non sei più solo nel regno della matematica e della tecnologia, ma nel regno delle normative legali. La maggior parte delle persone che leggono questo non sono avvocati che hanno familiarità con le leggi riguardanti le caratteristiche che un dispositivo che sceglie il vincitore di una lotteria deve possedere. Consiglierei di consultare un avvocato e uno statistico prima di passare più tempo a perseguire una soluzione tecnica. Certamente nessuna * semplice * soluzione "pseudo casuale" sarà accettabile; si può facilmente capire quale sia il prossimo numero vincente da quelli precedenti con un PRNG. –