|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
Generare numero casuale
Come si realizza una funzione che restituisce un numero casuale ?
Ovviamente senza utilizzare le funzioni gia belle e pronte. Il linguaggio di programmazione non è importante, voglio solo capire il ragionamento
__________________
Cinema e Film |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Si puo' utilizzare un generatore pseudocasuale, come un LCG
http://en.wikipedia.org/wiki/Linear_...tial_generator Oppure puoi basarti sul tempo di sistema se la risoluzione e' molto piu' alta del tuo campionamento e se il tuo campionamento non e' periodico. Oppure buoi estrarre un UUID, praticamente presente su tutte le piattaforme di programmazione moderne (sotto le piattaforme Microsoft e' noto come GUID). Nella sua implementazione piu' comune l'algoritmo del UUID contiene una parte di cifratura di dati simile ad uno dei passi dell'LCD, e i tra i dati c'e' anche il tempo di sistema con risoluzione a 100 nanosecondi. In pratica metteresti insieme i due concetti. Un UUID e' un numero a 16 byte. Ti bastera' calcolare il modulo di tale numero per il massimo del tuo range. Quindi se il tuo massimo e' sensibilmente piu' basso di un numero a 16byte (e nella stragrande maggioranza dei casi e' cosi') e se il tuo campionamento non e' mai inferiore a 100ns (e nella maggioranza dei casi e' cosi'), allora questo metodo e' semplice e funzionale.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
Grazie penso che le combinerò tutte insieme
__________________
Cinema e Film |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Puoi anche mettere un microfono fuori dalla finestra e catturare il rumore di fondo. Non è crittogaficamente sicuro ma si riescono a tirar fuori delle belle sequenze. Il problema è che non sono ripetibili.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#5 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Se vuoi saperne di più sulla generazione di sequenze pseudo casuali ti consiglio:
Menezes, van Oorschot, Vanstone - Handbook of applied cryptography E' un ottimo libro free online della CRC Press. Si usa a livello universitario. Comunque il principio è quello di avere una fonte di "entropia". L'entropia è un concetto che torna in molte discipline ed è puramente astratto, cioè è un modo per dire "qualcosa che non esiste". In pratica il generatore di entropia pura genera bit 0 o 1 con probabilità 0.5. Esistono aggeggi che approssimano questo comportamento, generalmente ottenuto per mezzo di strumenti hardware o x mezzo di misurazioni quali il ritmo con cui batti tasti sulla tastiera, il rumore di un microfono, ecc... Oppure combinando tutte queste cose. A questo punto hai una sequenza molto "sicura", generalmente troppo sicura per i nostri semplici scopi, quindi si usa un generatore di numeri pseudocasuali (PRNG) che prende in ingresso una sequenza di N bit detta seme e ne produce una non periodica di M bit (dove M è molto più grande di N) detta pseudocasuale. Ovviamente gli M-N bit aggiunti sono calcolati in funzione degli N bit iniziali (quelli sicuri) secondo una formula (se lineare hai un generatore lineare). Ovviamente il prodotto di un generatore pseudocasuale sarà facilmente prevedibile in quanto avendo una sequenza finita in ingresso produrrà una sequenza infinita in uscita, che sarà infinita solo perchè ad un certo punto comincerà a ripetersi. Un generatore del genere è utile per scopi non crittografici: nel caso della crittografia non si può utilizzare perchè se qualcuno "registrasse" per molto tempo la sequenza arriverebbe a determinare il seme potendone prevedere il comportamento futuro! |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
lo stesso vale per qualunque altra proprietá utile di un UUID, come la distribuzione uniforme (non so se ce l'hanno, dico per fare un esempio). a questo punto seriamente tanto vale mettere il microfono fuori dalla finestra. |
|
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Quote:
Diciamo che occorrerebbe anche dimostrare il teorema: Sia Sn una successione di valori casuali, allora anche Sn%M (La successione dei valori in modulo M) e' una successione di valori casuali. Lascio al lettore la facile dimostrazione (Ho sempre sognato di poterlo dire...)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 26-05-2009 alle 00:51. |
||
|
|
|
|
|
#8 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Ma perché usare:
/dev/urandom /dev/random fa schifo? O non è su linux? |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
intanto scarico anche il libro
__________________
Cinema e Film |
|
|
|
|
|
#10 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
xsatellitex ma nello specifico cosa devi fare? Questo aiuterebbe a capire che tipo di generatore ti serve.
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
No volevo solo capire come vengono realizzati i generatori di numeri casuali che di solito si trovano come funzioni built-in in molti linguaggi di programmazione
__________________
Cinema e Film |
|
|
|
|
|
#12 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Quelli che trovi, ad esempio in C/C++ sono generatori lineari congruenziali. Non li trovi nel libro che ti ho detto io, ma se cerchi su google si.
|
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
2. i computers non memorizzano numeri arbitrariamente grandi, chiarisci l'intervallo dei suddetti valori; 3. perché la successione si chiama Sn? i valori sono in numero di n? Quote:
Ultima modifica di fero86 : 26-05-2009 alle 16:55. |
||
|
|
|
|
|
#14 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Scusate la deformaziona ingegneristica... a cosa serve la dimostrazione??? Lasciatela ai matematici!
Cmq tanto per rispondere alla domanda iniziale http://it.wikipedia.org/wiki/Numeri_pseudo-casuali http://it.wikipedia.org/wiki/Generat..._congruenziale Ultima modifica di Ikon O'Cluster : 26-05-2009 alle 17:22. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Altrimenti ci possono essere irregolarita' nella distribuzione che farebbero preferire alcuni valori (quelli piu' bassi) rispetto ad altri.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Immagina di avere il range casuale tra 0 e 10000, quindi con distribuzione uniforme dei valori.
E di svilupparla con modulo 9000 Ovviamente i valori 0-1000 capiteranno il doppio piu' frequenti di quello 1000-9000 (relativi ai valori originali compresi tra 9000-10000 che in modulo 9000 torneranno tra 0-1000), e quindi la distribuzione non sara' piu' uniforme e non avremo piu' una successione casuale. Se invece la si siluppasse per esempio con modulo 11 (valore "a caso" non divisore del massimo del range di cui prima), allora e' pur sempre vero che alcuni valori, sempre i piu' bassi, sarebbero piu' frequenti, ma di una parte su 1000 circa. Per la dimostrazione rigorosa lascio a fero86, cosi' magari pensando a qualcosa raddrizza le ultime 2 giornate che mi sembrano partite con il piede sbagliato.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#17 | |||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
Quote:
|
|||
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
se vuoi sapere cosa succede di fatto quando si usa l'operatore modulo a sproposito leggiti questo interessantissimo articolo: http://www.hwupgrade.it/forum/showthread.php?t=1196677 paragrafo "Sequenze uniformemente distribuite in un intervallo assegnato". |
|
|
|
|
|
|
#20 | |||||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
Quote:
Quote:
si richiedono un po' troppe interpretazioni per questo teorema, mi sembra un po' farlocco... tanto vale che affermi empiricamente qualcosa anch'io: direi di non usare sto modulo su di un GUID. Quote:
) per una nostra S3 (3 scritto a pedice): {1, 2, 3, 4}; la successione {1, 2, 3, 4} contiene n+1=4 valori. va tutto bene?
|
|||||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:04.












) per una nostra S3 (3 scritto a pedice): {1, 2, 3, 4}; la successione {1, 2, 3, 4} contiene n+1=4 valori. va tutto bene?








