2013-12-29 4 views
0

У меня есть 4 целых числа, с которыми я хочу преобразовать в семя, чтобы создать случайное число. Я понимаю, что это произвольно по большей части, но я все же хочу убедиться, что то, что я делаю сейчас, не является излишним (или не генерирует достаточного распространения в значениях семян).Генерация значений семян для генераторов псевдослучайных чисел

У меня есть примерно 1000 объектов, которые я хочу иметь случайные свойства, основанные на некоторых из их переменных.

Две переменные являются постоянными и имеют диапазон 0 - 1000 и являются случайными для каждого объекта, могут возникать дубликаты, но это маловероятно (constant1 и constant2). Две другие переменные изменяются с дельтами 1 в течение длительных периодов времени через запуск программы, начиная с 0, могут находиться где угодно в пределах подписанного диапазона int32, но будут иметь тенденцию быть между -100 и 100 (variable1 и variable2).

Как вы соответствующим образом генерируете семена из этих 4 значений?

+0

Как насчет '(константа1 * variable1) XOR (константа2 * переменная2)' –

+0

Так как 'variable1' и' variable2' начинаются со значения 0, все объекты изначально будут иметь одно и то же семя! –

+0

Затем выполните 'variable1 + 1' и' variable2 + 1'. Являются ли переменные «переменными» более предсказуемыми? Как они точно меняются? То же самое для всех объектов? Я имею в виду, они будут детерминировать изменения ценностей? Если да, зачем использовать их в качестве (части) семени? –

ответ

0
  1. Вы, вероятно, следует инициализировать Random генератор только один раз, когда экземпляр класса инициализируется, так что вы должны использовать только 2 из свойств (другой 2 установлены в 0 по умолчанию, не так ли?), Чтобы получить семя.

  2. Из 1. и предполагая, что constant1 и constant2 случайны по умолчанию в пределах 0-1000, вы можете использовать constant1 * 1000 + constant2, чтобы получить случайное число от 0 до 1000000. я не уверен, о распределении случайности, но она должна будет достаточно, чтобы получить семя.

Update

Если вам действительно нужно, чтобы получить семена в зависимости от двух других переменных, вы можете следовать шаблону и сделать это следующим образом:

var seed = ((variable1 * 200 + variable) * 1000 + constant1) * 1000 + constant2; 

, но потому, что она превышает Int32 диапазон вы должны сделать это в unsafe контекст для предотвращения OverflowException быть брошен.

И последнее: Я не уверен, что 100% это даст вам нормализованное распределение генерируемых значений.

+0

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

+1

Но зачем вам семена менять? Это не даст вам более случайных результатов. – MarcinJuraszek

+0

Меняющиеся переменные относятся к позициям объектов, а описанные случайные свойства должны быть связаны с этими позициями. Я не могу просто использовать 'Random.Next()' каждый раз, когда переменные меняются, поскольку мне нужно, чтобы эти свойства были согласованными при переходе от точки A к точке B обратно к точке A. –

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