Qualche giorno fa mi sono fatto l'ennesimo programmino per il poker: si trattava di una simulazione per calcolare alcune probabilità. In pratica facevo test di 100.000 esperimenti analizzandone i risultati.
Siccome il programma era piuttosto lento ho usato il profiler per vedere dov'era il problema: il collo di bottiglia era la mia procedura per la generazione dei numeri pseudocasuali che, in pratica, richiama per cento volte il generatore fornito in Java prima di restituire il valore richiesto.
Ecco i risultati (*1) ottenuti in due distinte esecuzioni:
1) 3.0 - 2.9
2) 5.8 - 5.9
3) 8.8 - 8.8
4) 11.6 - 11.6
5) 14.5 - 14.3
6) 17.2 - 17.1
7) 19.7 - 19.5
8) 22.4 - 22.1
9) 24.5 - 24.5
Per velocizzare il tutto ho provato a usare direttamente il generatore Java (senza cioè richiamarlo 100 volte per ogni numero). Ed ecco i risultati:
1) 2.6 - 2.6
2) 5.2 - 5.0
3) 7.8 - 7.5
4) 10.2 - 9.5
5) 12.1 - 12.3
6) 14.0 - 14.6
7) 17.2 - 17.2
8) 19.2 - 19.9
9) 21.3 - 22.0
È evidente che i valori sono mediamente sfalzati di circa due unità!
Considerato poi che i valori teorici che mi aspettavo per 1) e 2) erano 3.0 e 6.0 è chiaro che è la versione lenta quella più affidabile.
Niente di strano in questo: i generatori di numeri pseudocasuali si chiamano "pseudo" proprio perché non sono realmente casuali ma cercano di imitare la casualità.
Ma imitare la cusualità non è assolutamente facile e per questo esistono numerosi test per valutare l'efficacia dei diversi algoritmi.
Il test più semplice è quello chiamato del chi quadro che valuta se le frequenze sono compatibile con le probabilità teoriche: cioè se si simula di lanciare un dado per un milione di volte ci si aspetta che ogni possibile valore esca circa 1/6 delle volte.
Un altro test potrebbe essere quello di simulare il lancio di 3 dadi e verificare che la frequenza con cui esce 6 su tutti i dadi sia compatibile con la probabilità prevista (1/216 dei lanci totali).
Infine ricordo che c'era un test, chiamato Montecarlo, che vericava l'affidabilità degli algoritmi pseudocasuali simulando delle mani di poker...
Evidentemente il generatore fornito da Java non era stato vericato con quest'ultimo test!
Nota (*1): Sfido il lettore a cercare di indovinare di quali probabilità si tratta! Suggerimento: notate la numerazione da 1 a 9 e tenete presente che i vari valori sono delle percentuali da 0 a 100...
Io vorrei i tre giorni di sonno!
13 ore fa
Nessun commento:
Posta un commento