Frequenza dati e funzione rand e srand
Salve, ho scritto un piccolo programmino che mi calcola la frequenza dell'uscita dei numeri da 1 a 6 di un dado lanciato 6 milioni di volte ..... provandolo su due macchine differenti ( ma entrambe 64 bit ) ottengo dei risultati in frequenza leggermente diversi : esempio su una l'occorrenza dell' 1 è di 1000167 , sull'altra sempre per 1 è 1000107 .... come mai ? Una monta macOs ( macbook pro) , l'altra windows 10 .... compilatori diversi ? grazie
Risposte
Su ogni macchina quante volte lo hai provato il programmino? Una volta presumo, o sbaglio?
Esistono diverse ragioni per questa discrepanza:
1. Dal punto di vista puramente statistico, assumendo che i due esperimenti siano indipendenti, è improbabile che i risultati siano gli stessi.
1. Siccome il generatore non è davvero casuale, sullo stesso sistema è possibile generare gli stessi valori passando lo stesso valore alla funzione srand. Se non è questo il caso, per esempio se hai inizializzato il valore usando il tempo attuale, allora è decisamente improbabile ottenere gli stessi valori.
2. Lo standard non definisce infine come debba essere implementato il generatore di numeri casuali. L'implementazione potrebbe essere (e molto probabilmente è) molto diversa. I valori generati su due sistemi diversi sono quindi quasi sicuramente diversi.
Se è importante generare gli stessi valori su sistemi diversi è necessario fare uso di una qualche libreria che garantisca che l'implementazione è la stessa nei due sistemi (di solito significa includere una qualche libreria come PCG). Se desideri ottenere esattamente 1000000 per ogni valore allora credo che il modo più semplice sia fare come si fa quando si gioca a carte: mischiare il mazzo ogni volta che finiscono le carte. In altre parole ti crei un array di 6 valori e lo mischi ogni volta che hai estratto 6 valori. Ovviamente questo metodo non corrisponde all'idea di lanciare un dato per un certo numero di volte.
1. Dal punto di vista puramente statistico, assumendo che i due esperimenti siano indipendenti, è improbabile che i risultati siano gli stessi.
1. Siccome il generatore non è davvero casuale, sullo stesso sistema è possibile generare gli stessi valori passando lo stesso valore alla funzione srand. Se non è questo il caso, per esempio se hai inizializzato il valore usando il tempo attuale, allora è decisamente improbabile ottenere gli stessi valori.
2. Lo standard non definisce infine come debba essere implementato il generatore di numeri casuali. L'implementazione potrebbe essere (e molto probabilmente è) molto diversa. I valori generati su due sistemi diversi sono quindi quasi sicuramente diversi.
Se è importante generare gli stessi valori su sistemi diversi è necessario fare uso di una qualche libreria che garantisca che l'implementazione è la stessa nei due sistemi (di solito significa includere una qualche libreria come PCG). Se desideri ottenere esattamente 1000000 per ogni valore allora credo che il modo più semplice sia fare come si fa quando si gioca a carte: mischiare il mazzo ogni volta che finiscono le carte. In altre parole ti crei un array di 6 valori e lo mischi ogni volta che hai estratto 6 valori. Ovviamente questo metodo non corrisponde all'idea di lanciare un dato per un certo numero di volte.
si alla fine mi sono reso conto che dipende dal fatto che ho impostato col valore time della macchina quindi anche pochi secondi fanno variare il tutto ...
"Super Squirrel":
Su ogni macchina quante volte lo hai provato il programmino? Una volta presumo, o sbaglio?
no genio, provato 4 volte su ogni macchina quindi 8 volte
Grazie del genio, ma continuo a non capire...
Innanzitutto dal tuo primo post, avendo omesso dettagli fondamentali, non si capisce bene quale sia il problema, quindi sia la mia risposta che quella di apatriarca non sono altro che congetture.
Non avendo postato il codice, ho dato per scontato che il programmino fosse scritto in modo corretto (ossia passando alla funzione srand il tempo attuale) e il mio primo post si basa sull'osservazione che risulta praticamente impossibile ottenere gli stessi risultati lanciando più volte il programma anche sulla stessa macchina.
Qui la questione diventa ancora meno chiara...
Da questo post mi sembra di capire che hai passato a srand() ogni volta un valore diverso, quindi come hai fatto ad ottenere per ben 4 volte lo stesso risultato? Una coincidenza?
Per fugare ogni dubbio perchè non posti il codice in questione e ci spieghi bene i dettagli del tuo "esperimento"?!
Innanzitutto dal tuo primo post, avendo omesso dettagli fondamentali, non si capisce bene quale sia il problema, quindi sia la mia risposta che quella di apatriarca non sono altro che congetture.
Non avendo postato il codice, ho dato per scontato che il programmino fosse scritto in modo corretto (ossia passando alla funzione srand il tempo attuale) e il mio primo post si basa sull'osservazione che risulta praticamente impossibile ottenere gli stessi risultati lanciando più volte il programma anche sulla stessa macchina.
si alla fine mi sono reso conto che dipende dal fatto che ho impostato col valore time della macchina quindi anche pochi secondi fanno variare il tutto ...
Qui la questione diventa ancora meno chiara...
Da questo post mi sembra di capire che hai passato a srand() ogni volta un valore diverso, quindi come hai fatto ad ottenere per ben 4 volte lo stesso risultato? Una coincidenza?

Per fugare ogni dubbio perchè non posti il codice in questione e ci spieghi bene i dettagli del tuo "esperimento"?!