2009-05-26 11 views
11

Come vengono generati i numeri casuali? In che modo linguaggi come java, ecc., Generano numeri casuali, specialmente come è fatto per i GUID? ho trovato che algoritmi come il generatore Pseudorandomnumber utilizza valori iniziali.Come generare numeri "casuali" ma anche "univoci"?

Ma ho bisogno di creare un programma di numeri casuali, in cui un numero si è verificato non dovrebbe mai ripetersi anche se il sistema viene riavviato. Ho pensato che ho bisogno di memorizzare i valori ovunque in modo da poter verificare se il numero si ripete o no, ma sarà troppo complesso quando la lista va oltre i limiti.?

+2

Vuoi un generatore GUID? In tal caso, fornisci la lingua e il sistema operativo su cui stai lavorando. Ti spiegheremo come utilizzare la libreria GUID per la tua piattaforma. –

+0

Duplica (quasi) di http://stackoverflow.com/questions/506118/how-to-manually-generate-random-numbers –

+0

@ S.Lott: ya. Sto usando VS2005 in Windows xp e C#. @Binary Worrier: mi spiace perché non ho trovato la domanda StackOverflow durante la pubblicazione di questo. – SyncMaster

risposta

18

Primo: se il numero è garantito per non ripetersi mai, non è molto casuale.

Secondo: ci sono un sacco di PRNG algorithms.

UPDATE:

Terzo: C'è un IETF RFC for UUIDs (ciò che MS chiama GUID), ma si dovrebbe riconoscere che (U | G) UID sono non crittograficamente sicuro, se questo è un problema per voi.

UPDATE 2:

Se si desidera utilizzare effettivamente qualcosa di simile nel codice di produzione (non solo per la vostra edificazione) prega utilizzare una libreria preesistente. Questo è il tipo di codice che è quasi sicuro di avere bug sottili in esso se non lo hai mai fatto prima (o anche se lo hai).

UPDATE 3:

Ecco il docs for .NET's GUID

+0

+1: credo che siano tutte le basi coperte, se questo non risponde alla domanda come richiesto, nulla lo sarà :) –

+0

È interessante notare che il LCG (http://en.wikipedia.org/wiki/Linear_congruential_generator) è solo seminato dal valore precedente, creerà una sequenza non ripetuta. Cioè, non ci saranno ripetizioni fino a quando l'intera sequenza si ripete. – Sionide21

+1

Un RNG può certamente essere casuale se non si ripete. Ciò richiede semplicemente di avere la stessa possibilità di scegliere qualsiasi numero non selezionato finora. – MSalters

0

La maggior parte dei generatori di numeri casuali dispone di un modo per reinizializzare "casualmente" il valore di inizializzazione. (A volte chiamato randomize).

Se ciò non è possibile, è anche possibile utilizzare l'orologio di sistema per inizializzare il seme.

+1

l'orologio di sistema è una cattiva idea. se gestisci un sito di poker, posso usare prove ed errori e facilmente elaborare il tuo seme sulla base delle ultime carte e indovinare la differenza di tempo tra i nostri orologi. – SillyMonkey

3

Ci sono un sacco di modi si potrebbe generare numeri casuali. Di solito è fatto con una chiamata di sistema/libreria che usa un generatore di pseudo-numero con un seme come hai già descritto.

Ma ci sono altri modi per ottenere numeri casuali che coinvolgono hardware specializzato per ottenere VERO numeri casuali. So di alcuni poker sites che usano questo tipo di hardware. È molto interessante leggere come lo fanno.

+0

Presumibilmente questo si basa sull'osservazione di particelle in decomposizione? Dannazione, ci sarà la mia prossima mezz'ora. – annakata

+0

heheheheheheheheheheheh –

+1

Si può fare usando un diodo tenuto vicino al suo ginocchio (è il termine in inglese?) Dove è molto instabile e può passare in modo casuale dalla corrente passante alla corrente non passante. –

0

In particolare per quanto riguarda Java:

0

Capisco che si sta cercando un modo per generare numero casuale usando C#. Se sì, RNGCryptoServiceProvider è quello che stai cercando.

[EDIT]

Se si genera un tempo abbastanza lungo numero di byte che utilizzano RNGCryptoServiceProvider, è probabile che sia unico, ma non v'è alcuna gurantee. In teoria, i veri numeri casuali non significano essere unici. Lanciate un dado 2 volte e potreste avere la testa entrambe le volte ma sono ancora casuali. VERO CASUALE!

Immagino di applicare il controllo di essere univoco, devi solo implementare il tuo meccanismo per mantenere la cronologia dei numeri precedentemente generati.