Deduzioni logiche su generazione di numeri casuali in linguaggio C
Carissimi,
innanzitutto grazie per l'ospitalità!
Veniamo a ciò che ci sta a cuore ossia la matematica.
Ho un problema nel capire alcune osservazioni che vengono fuori riguardo la generazione di numeri random con il pc attraverso la funzione rand () del C.
Non afferro delle deduzioni logiche che seguono il metodo dei congruenziali lineari.
Sappiamo che la funzione rand() genera un intero da 0 a RAND_MAX utilizzando il metodo delle congruenze lineari.
Di primo acchitto se volessi un numero in un intervallo [0..N] la cosa più logica sarebbe quella di utilizzare la forma rand() % N (laddove "%" sta per "resto della divisione")
Si legge in letteratura che se N è divisore di RAND_MAX + 1 ( già non capisco il perchè questo "+1" e non semplicemente RAND_MAX) e chiamiamo K questo divisore, è come se avessi la possibilità di ripetere K volte le cosiddette classi resto da 0 ad N-1 (quindi N classi resto ciascuna k volte) ed otterrei una distribuzione uniforme per cui tutto fila.
Se N non è divisore di RAND_MAX +1, perchè la probabilità che esca 0 dalla "rand () % N" è maggiore di quella in cui si avrebbe N-1? (primo quesito).
Perchè utilizzando la forma rand() % N andrei ad usare le sole cifre meno significative? Ha a che fare con il periodo in cui i miei valori si possono ripetere?
Per ovviare al problema dell'utilizzo delle cifre meno significative viene suggerito di effettuare il ragionamento non considerando il generico intervallo [0,N] bensì [0,1).
Perchè viene escluso l'estremo superiore?
Non potrebbe essere incluso anch'esso?Cosa cambierebbe in tal caso?
Leggendo ed interpretando qualche appunto si evince che per generare numeri pseudo casuali con un mix di estremi chiusi/aperti (sempre ovviamente tra 0 ed 1) si potrebbe operare nel modo che segue:
(0,1) - rand()+1/RAND_MAX+2
[0,1) - rand()/RAND_MAX+1
[0,1] - rand()/RAND_MAX
(0,1] - rand()+1/RAND_MAX
Mi sfugge qualche osservazione o ragionamento logico che mette in evidenza eventuali falle
ed imperfezioni nella cosiddetta "pseudocasualità e distribuzione uniforme in tutto l'intervallo?"
Mi scuso se sono stato poco chiaro e se avessi per caso errato il "posizionamento" del post all'interno del forum.
Ero incerto se qui o nel settore "algebra e teoria dei numeri".Visto che parliamo di generazione di numeri in modo pseudocasuale ho optato per il settore statistico.
Vi ringrazio davvero se solo riusciste a chiarirmi anche uno solo di questi dubbi.
Un saluto
Alessandro
innanzitutto grazie per l'ospitalità!
Veniamo a ciò che ci sta a cuore ossia la matematica.
Ho un problema nel capire alcune osservazioni che vengono fuori riguardo la generazione di numeri random con il pc attraverso la funzione rand () del C.
Non afferro delle deduzioni logiche che seguono il metodo dei congruenziali lineari.
Sappiamo che la funzione rand() genera un intero da 0 a RAND_MAX utilizzando il metodo delle congruenze lineari.
Di primo acchitto se volessi un numero in un intervallo [0..N] la cosa più logica sarebbe quella di utilizzare la forma rand() % N (laddove "%" sta per "resto della divisione")
Si legge in letteratura che se N è divisore di RAND_MAX + 1 ( già non capisco il perchè questo "+1" e non semplicemente RAND_MAX) e chiamiamo K questo divisore, è come se avessi la possibilità di ripetere K volte le cosiddette classi resto da 0 ad N-1 (quindi N classi resto ciascuna k volte) ed otterrei una distribuzione uniforme per cui tutto fila.
Se N non è divisore di RAND_MAX +1, perchè la probabilità che esca 0 dalla "rand () % N" è maggiore di quella in cui si avrebbe N-1? (primo quesito).
Perchè utilizzando la forma rand() % N andrei ad usare le sole cifre meno significative? Ha a che fare con il periodo in cui i miei valori si possono ripetere?
Per ovviare al problema dell'utilizzo delle cifre meno significative viene suggerito di effettuare il ragionamento non considerando il generico intervallo [0,N] bensì [0,1).
Perchè viene escluso l'estremo superiore?
Non potrebbe essere incluso anch'esso?Cosa cambierebbe in tal caso?
Leggendo ed interpretando qualche appunto si evince che per generare numeri pseudo casuali con un mix di estremi chiusi/aperti (sempre ovviamente tra 0 ed 1) si potrebbe operare nel modo che segue:
(0,1) - rand()+1/RAND_MAX+2
[0,1) - rand()/RAND_MAX+1
[0,1] - rand()/RAND_MAX
(0,1] - rand()+1/RAND_MAX
Mi sfugge qualche osservazione o ragionamento logico che mette in evidenza eventuali falle
ed imperfezioni nella cosiddetta "pseudocasualità e distribuzione uniforme in tutto l'intervallo?"
Mi scuso se sono stato poco chiaro e se avessi per caso errato il "posizionamento" del post all'interno del forum.
Ero incerto se qui o nel settore "algebra e teoria dei numeri".Visto che parliamo di generazione di numeri in modo pseudocasuale ho optato per il settore statistico.
Vi ringrazio davvero se solo riusciste a chiarirmi anche uno solo di questi dubbi.
Un saluto
Alessandro
Risposte
RAND_MAX è il massimo numero generabile. Quindi il numero è come se fosse generato modulo RAND_MAX+1. Se N non divide RAND_MAX+1 allora RAND_MAX+1 = kN + d . Prova a concludere questo ragionamento.
Grazie per la risposta!Mi sfugge solo se essa è considerabile come il punto di partenza per le deduzioni sulla probabilità.Sono corrette invece le conclusioni sugli intervalli e da ultimo perchè è preferibile lasciare l'estremo destro "aperto" anche se su tantissime dispense non vedo l'esclusione di questo come qualcosa che migliora il comportamento della funzione che genera questi numeri pseudocasuali.
Grazie ancora
Alessandro
Grazie ancora
Alessandro