Numeri casuali non realistici

di il
3 risposte

Numeri casuali non realistici

Chi mi sai dire perchè più o meno un numero casuale esce il 10% delle volte ?

import java.util.Random;
public class Esperimento {

	public static void main(String[] args) {
		int conta = 0;
		Random ncasuale = new Random();
		for (int nCasuale = 0; nCasuale <100000; nCasuale++){
			if (ncasuale.nextInt(10) == 7) conta++;
		}
		System.out.println("Il numero 7 è uscito " + conta + " volte.");
	}
}
secondo voi sono attendibili i nunmeri casuali? c'è un modo per renderli più simili alla realtà delle cose?

grazie.


ps. il mio codice poteva essere scritto meglio? suggeritemi qualcosa, perchè comincio ora con Java.

3 Risposte

  • Re: Numeri casuali non realistici

    La generazione di numeri casuali e' un argomento estremamente complesso, anche se non sembra.

    Partiamo dalla considerazione fondamentale: con un computer non si potranno MAI generare dei numeri perfettamente casuali, per il banale motivo che il generatore e' necessariamente un programma e come tale ripetibile.

    Quello che si generano sono dei numeri pseudocasuali.

    L'unico modo per generare numeri veramente casuali e' quello di avere una sorgente naturale: l'idea piu' banale e' una sorgente radioattiva. Ma ovviamente, a parte il problema radioattivo, una sorgente perfettamente casuale non serve a molto: non e' ripetibile

    E gia': casuale e ripetibile sono agli antipodi: o uno o l'altro, non entrambi.

    E la ripetibilita' e' fondamentale: se il programma non funziona, e' necessario rieseguirlo con gli stessi dati per vedere dove si incarta.

    Ora, il generatore di numeri pseudocasuali messo a disposizione dalla libreria standard di ogni linguaggio di programmazione e' abbastanza buono per la maggior parte delle applicazioni. Genera tutti i numeri compresi all'interno di un range che dipende dal generatore. Nella maggior parte dei casi e':

    [0, 2^31-1]

    per le piattaforme a 32 e 64 bit.

    Inoltre ha anche un'altra caratteristica: ha un periodo, cioe' dopo aver generato un certo numero di numeri, la sequenza ricomincia. La lunghezza di questa sequenza e' appunto il 'periodo'.

    Ovviamente non e' detto che il periodo concida con il range di valori generato: il periodo e' necessariamente piu' piccolo o uguale a tale range.

    In generale, comunque, i generatori sono progettati per avere il periodo piu' lungo possibile e generalmente coincide anche con il range.

    Questo vuol dire che ogni numero del range viene generato una ed una sola volta, fono al termine del periodo, quindi ricomincia.

    Ci sono generatori che hanno periodi anche piu' lunghi ([0, 2^32-1], [0, 2^64-1], [0, 10^600], ...) ma servono per specifiche applicazioni.

    Proprio di recente ho dovuto affrontare tale tipo di problema: nel mio lavoro ho avuto la necessita' di generare oltre 10^10 numeri casuali.
    Ora, con il generatore di default del C++ (che ne genera SOLO 2*10^9) mi sono ritrovato con dei comportamenti estremamente strani. Ci e' voluto un po' per capire che era colpa del generatore.

    Ho usato un nuovo generatore, per la precisione il Mersenne Twister, e' gli strani comportameni sono miracolosamente spariti. E questo generatore ha un periodo di 10^600 generando numeri nel range [0,2^64-1] (si, 2^64 e' molto piu' piccolo di 10^600, ma questo solo perche' il vero valore e' mantenuto all'interno delle strutture dati che implementano l'algoritmo, e viene ritornato tale valore modulo 2^64)

    Quindi, come vendi, c'e' un modo dietro ad un semplice generatore di numeri casuali.

    E la risposta alla tua domanda e': no in generale, ma esistono dei generatori adatti a vari tipi di applicazioni.

    Giusto per concludere, il Mersenne Twister, pur avendo come periodo 10^600, non e' adatto all'uso in crittografia (anche qui' servono i generatori di numeri casuali) perche' con 600 valori consecutivi qualunque, e' possibile risalire a quali sono i coefficienti della formula utilizzata per implementarlo.
    E 600 valori si generano in microsecondi
  • Re: Numeri casuali non realistici

    Bellissima la spiegazione ... anche se ovviamente ho colto l`aspetto logico del ragionamento .
  • Re: Numeri casuali non realistici

    Bellissima la spiegazione, anche se ovviamente ne ho potuto cogliere solo l`aspetto logico del ragionamento .
    grazie davvero, molto interessante.
Devi accedere o registrarti per scrivere nel forum
3 risposte