2011-11-08 20 views
15

Il seguente semplice programma in Java utilizza la classe java.util.Random in modo da visualizzare sempre "ciao mondo". Lo snippet di codice può essere visto sotto.Perché l'utilizzo di Random con un seme codificato produce sempre gli stessi risultati?

package nomain; 

import java.util.Random; 

final public class J 
{ 
    public static String randomString(int seed) 
    { 
     Random rand = new Random(seed); 
     StringBuilder sb = new StringBuilder(); 

     for(int i=0;;i++) 
     { 
      int n=rand.nextInt(27); 
      if (n==0) 
      { 
       break; 
      } 
      sb.append((char) ('`'+n)); 
     } 
     return sb.toString(); 
    } 

    public static void main(String args[]) 
    { 
     System.out.println(randomString(-229985452)+' '+randomString(-147909649)); 
    } 
} 

V'è una certa sorpresa in quanto visualizza sempre "ciao mondo", anche se la classe Random viene utilizzata che causa i numeri casuali per generare di conseguenza, il numero dovrebbe essere cambiato in ogni corsa e il corrispondente i personaggi dovrebbero essere cambiati di conseguenza, ma mostra sempre solo una stringa stabile che è come menzionato sopra "Ciao mondo". Perché succede?

+0

Questo probabilmente ha a che fare con il fatto che i generatori di numeri casuali sono deterministici ... nel senso, se viene utilizzato lo stesso valore di inizializzazione, la stessa sequenza verrà generata ogni volta. Ma io non sono positivo. – Bryan

+7

Questa domanda non è un duplicato di quella domanda. Quella domanda è duplicata di questa invece. – Lion

risposta

26

La risposta è il parametro che viene passato. Viene utilizzato per seminare il generatore di numeri casuali.

Random rand = new Random(seed); 

I PRNG non sono veramente casuali, sono deterministici, ma sono progettati per simulare la casualità. Per questo motivo sono meglio definiti "generatori di numeri pseudo casuali".

Per un dato seme, un PRNG genera sempre lo stesso numero. Quindi probabilmente usa il suo ultimo risultato come input per il valore successivo, quindi seminando il PRNG con un valore noto, genererai sempre una sequenza nota di numeri "casuali".

I numeri -229985452 e -147909649 sono noti come semi che causeranno quel particolare PRNG per produrre una sequenza di 5 numeri che possono essere interpretati come "ciao" e "mondo". Se dovessi cambiare quei numeri, otterresti sequenze di 5 caratteri diverse, ma sarebbero uguali per ogni esecuzione del programma, purché il seme rimanga lo stesso.

Problemi correlati