2016-05-13 20 views
1

Ich versuche, ein System zu verteilen, und ich brauche nextGaussian() aus der Java-Klasse Random. Der einzige Weg, den ich gefunden habe, um die Datenabhängigkeit zu brechen, die ein eindeutiger Seed erzeugt, war die Verwendung mehrerer Seeds, wodurch mehrere Randoms erzeugt wurden.Erstellen neue zufällige vs mit der gleichen Zufall

Lassen Sie uns über den Kontext meines Problems vergessen, ich möchte nur wissen, wie gut normalisierte Verwendung mehrerer zufällige Instanzen im Vergleich zur Verwendung nur einer Instanz ist. Mit anderen Worten ... Wie zufällig ist das genNew im Vergleich zu genSame?

Der Code:

public double[] genNew(int lim, long seed) 
{ 
    double[] rand = new double[lim]; 
    for(int i = 0; i < lim; i++) 
    { 
     //A random for each iteration. 
     Random r = new Random(i*seed); 
     rand[i] = r.nextGaussian(); 
    } 
    return rand; 
} 

public double[] genSame(int lim, long seed) 
{ 
    double[] rand = new double[lim]; 
    //A random for all iterations 
    Random r = new Random(seed); 
    for(int i = 0; i < lim; i++) 
     rand[i] = r.nextGaussian(); 
    return rand; 
} 

Die Ergebnisse ich sind sehr unterschiedlich, wenn ich beide Arrays zu meinem Code anzuwenden. Ich kann einfach nicht erklären warum.

EDIT: Ich weiß, dass dies nicht die gleichen Arrays erzeugen wird, ist es nur, dass bei Verwendung einer großen Menge von normalized Randoms eine Zahl berechnet, sollten beide Zahlen nahe sein (wegen der Normalisierung), aber sie sind nicht.

+1

RNGs sollten nicht verwendet werden, um eine Zahl zu generieren, sie liefern bessere Ergebnisse, wenn sie oft verwendet werden. Hast du die Werte von genNew überprüft? –

+0

Ja, die Werte saugen. Deshalb habe ich mich gefragt, ob ich etwas falsch mache ... –

+0

Warum "saugen" die Werte? Warum glaubst du, dass sie nicht zufällig sind? Solange Sie die Methode 'genSame()' verwenden, sollten sie ziemlich zufällig sein, obwohl Computer niemals wirklich zufällig arbeiten können, aber sehr nahe kommen können. [Schauen Sie hier für weitere Informationen über Zufallszahlen] (https://blog.malwarebytes.org/cybercrime/2013/09/in-computers-are-random-numbers-really-random/) – Draken

Antwort

0

Ich habe einen Weg gefunden, angemessene Zahlen zu generieren und die Datenabhängigkeit zu brechen.

Ich verstehe nicht, warum dieser Faktor funktioniert, aber es tut. Ich habe es zufällig gefunden und ich habe fast eine Million Millionen Tests daran gemacht und arbeite weiter, ohne zu versagen.

Wenn jemand versteht, warum das funktioniert, bitte sagen:

Random r = new Random(seed * 43112609) 

Diese Zahl eine Primzahl ist. Das ist der einzige Anhaltspunkt, den ich habe, aber trotzdem kann ich wirklich nicht verstehen, warum es funktioniert.