2016-05-11 3 views
1

Мне нужно раздать систему Java, использующую псевдоданные. Каждый узел системы должен обрабатывать определенное количество рандомов.Можно ли разделить псевдослучайное событие

Результаты должны быть воспроизводимыми, поэтому рандомы должны зависеть от семени в качестве параметра.

Random random = new Random(long seed); 

Например, если нужно обрабатывать 100 Randoms и у меня есть 2 узла, первый узел должен обрабатывать от 1 до 50, а второй от 51 до 100.

Проблема заключается в том, что нужно pseudorandoms перебирать себя, чтобы каждый раз воспроизводить ту же последовательность рандомов (для одного и того же семени).

В предыдущем примере есть ли способ начать генерировать рандомы во втором узле из 51-го случайного? (Таким образом, избегая необходимости генерировать и удалять randoms от 1 до 50 в этом узле).

+1

Не особо. Вам лучше разобраться в другой схеме, как разделить случайные числа между узлами, например. два узла будут использовать каждое другое случайное число, а не первые 50 и последние 50. Нужно ли его воспроизводить, даже если вы измените количество узлов? Если это не так, это может облегчить задачу, связав другие экземпляры «Random» с семенами, созданными первым «Random». –

+0

Хм ... это не решило бы мою проблему, так как каждый узел должен был обрабатывать до 100-го случайного в любом случае. –

+0

Не используйте псевдослучайные последовательности, вместо этого используйте хеш-функцию. Первый узел обработает хэши 1.50, второй обработает хэши 51..100 –

ответ

0

Что относительно random.nextInt(50) + 50?

Вы можете использовать одно и то же семя, на одном узле вы делаете «+ 0» на другом, что вы делаете «+ 50».

Если вам это не нравится, вы получите одну и ту же последовательность на обоих узлах сразу на 50, вы можете построить семя на узел из случайного генератора, используя одно и то же семя.

т.е.

Узел 1:

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

Узел 2:

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

узел 1 даст вам Интс от 0 до 50, узел два между 50 и 100.

+0

Проблема с этой стратегией заключается в том, что если мне нужно изменить количество узлов, которые обрабатывают randoms, это не сработает. Что бы я сделал с третьим узлом? Я должен добавить, например, +100 к случайному. И тогда seq randoms от 1 до 100 не будет одинаковым. –

+0

Я не читаю это как желающий _numbers_ между 0 и 50, но вместо того, чтобы требовать первых 50 чисел, которые генерирует 'Random', и будут генерироваться« '' '' '' '' '' '' '' '' '' '. –

0

Вы можете использовать альтернативный способ генерации псевдослучайной последовательности: Рассмотрим использование хеш-функции (типа integ er -> integer) и allpy это к натуральным числам, поэтому элементы в последовательности будут hash(0), hash(1), hash(2) вместо seed, step(seed), step(step(seed)). Таким образом, вы можете получить доступ к элементу i th в псевдослучайной последовательности в O(1) и можете распределять рабочую нагрузку по своему усмотрению.

Смежные вопросы