2016-05-11 21 views
1

Ich muss ein Java-System verteilen, das Pseudozufalls verwendet. Jeder Knoten des Systems muss eine bestimmte Anzahl von Randoms verarbeiten.Ist es möglich, ein Pseudozufall zu teilen

Die Ergebnisse müssen reproduzierbar sein, also müssen die Randoms von einem Seed als Parameter abhängen.

Random random = new Random(long seed); 

Wenn beispielsweise I 100 randoms verarbeiten müssen und ich habe 2 Knoten, muss der erste Knoten 1-50 verarbeiten und der zweite von 51 bis 100.

Das Problem ist, dass pseudorandoms brauchen um über sich selbst zu iterieren, um immer die gleiche Sequenz von Randoms zu erzeugen (für den gleichen Samen).

In dem vorherigen Beispiel gibt es eine Möglichkeit, die Generierung von Randoms im zweiten Knoten aus dem 51. Zufall zu starten? (So ​​vermeiden Sie die Notwendigkeit, Randoms von 1 bis 50 in diesem Knoten zu generieren und zu löschen).

+1

Nicht besonders. Sie wären besser dran, ein anderes Schema herauszufinden, wie die Zufallszahlen zwischen den Knoten aufgeteilt werden, z. Zwei Knoten würden jede andere Zufallszahl als die ersten 50 und die letzten 50 verwenden. Brauchen Sie, dass sie reproduzierbar ist, selbst wenn Sie die Anzahl der Knoten ändern? Wenn nicht, könnte das die Sache viel einfacher machen, indem man andere "Random" -Instanzen mit vom ersten "Random" erzeugten Seeds tastet. –

+0

Hmm ... das würde mein Problem nicht lösen, da jeder Knoten sowieso zum 100sten Random verarbeitet werden müsste. –

+0

Verwenden Sie keine Pseudozufallsfolgen, sondern eine Hash-Funktion. Der erste Knoten verarbeitet die Hashes von 1..50, der zweite verarbeitet die Hashes von 51..100 –

Antwort

0

Was ist mit random.nextInt(50) + 50?

Sie können den gleichen Seed verwenden, auf dem einen Knoten "+ 0" auf dem anderen tun Sie "+ 50".

Wenn Sie nicht möchten, dass Sie jetzt die gleiche Sequenz auf beiden Knoten nur um 50 bekommen, könnten Sie einen Samen pro Knoten aus einem Zufallsgenerator mit dem gleichen Samen erstellen.

dh

Node 1:

Random seedGenerator = new Random(globalSeed) 
Random myRandom = new Random(seedGenerator.nextInt()) 
int something = myRandom.nextInt(50) 

Node 2:

Random seedGenerator = new Random(globalSeed) 
seedGenerator.nextInt() // node 1's seed 
Random myRandom = new Random(seedGenerator.nextInt()) 
int something = myRandom.nextInt(50) + 50 

Knoten 1 wird Ihnen ints zwischen 0 und 50, zwei Knoten zwischen 50 und 100.

+0

Das Problem mit dieser Strategie ist, dass, wenn ich die Anzahl der Knoten ändern muss, die die Randoms verarbeiten, es nicht funktionieren würde. Was würde ich dann mit einem dritten Knoten tun? Ich würde zum Beispiel +100 zum Zufall hinzufügen. Und dann wäre das Seq von Randoms von 1 bis 100 nicht dasselbe. –

+0

Ich lese das nicht als wollen _numbers_ zwischen 0 und 50, sondern erfordern die ersten 50 Zahlen die 'Random' generieren würde und die zweite' 50' Zahlen die 'Random' generieren würde. –

0

Sie können eine alternative Methode zum Generieren einer Pseudozufallsfolge verwenden: Erwägen Sie die Verwendung einer Hash-Funktion (vom Typ integ er -> integer) statt, und allpy es zu den natürlichen Zahlen, so würde die Elemente in der Sequenz hash(0), hash(1), hash(2) anstelle von seed, step(seed), step(step(seed)) sein. Auf diese Weise können Sie auf das Element i in der Pseudozufallsfolge in O(1) zugreifen und die Arbeitslast beliebig verteilen.