Как сгенерировать случайное число, используя несколько начальных значений?

Мне нужно генерировать случайные числа на основе нескольких начальных значений, нужны некоторые идеи о том, как это сделать.

Пример ситуации: допустим, вы программируете научно-фантастическую игру с процедурной генерацией, в которой необходимо создавать планеты (размер, тип, ресурсы и т. д.), когда игрок летит в определенную солнечную систему. У вас есть игровой идентификатор и координаты X, Y, Z планеты. Чем теперь кормить генератор случайных чисел? Конечно, я не могу просто сложить числа, поскольку планета (1,2,3) будет точно такой же, как планета (3,2,1). Что делать кодеру?


person CodeOrElse    schedule 01.03.2012    source источник
comment
Любая причина не просто использовать время как семя? Хотите воспроизводимых результатов?   -  person Fred Foo    schedule 01.03.2012
comment
Зачем вам нужно новое семя каждый раз, когда вы хотите новое случайное число? Просто запустите один раз в начале программы; именно так были разработаны генераторы случайных чисел.   -  person Mr Lister    schedule 01.03.2012
comment
@larsmans, да, я хочу воспроизводимых результатов!   -  person CodeOrElse    schedule 01.03.2012
comment
@MrLister Если я засею в начале, результаты не будут воспроизводимы, так как я не могу сгенерировать всю галактику сразу. Мне нужно генерировать одну солнечную систему за раз, и я не знаю, в каком порядке игрок будет исследовать системы.   -  person CodeOrElse    schedule 01.03.2012
comment
mercenne_twister_engine может быть заполнен двумя способами — с помощью одного длинного значения без знака или с помощью экземпляра seed_seq, который оборачивает произвольно большой массив целых чисел. Возможно, это то, что я ищу! :) Теперь, чтобы понять, как его использовать, документации мало...   -  person CodeOrElse    schedule 01.03.2012


Ответы (1)


Предполагая, что вам всегда нужно одно и то же начальное число каждый раз для набора координат: просто зашифруйте объединенную строку с помощью MD5 или другого алгоритма хеширования. md5("1,2,3") не совпадает с md5("3,2,1"). Или, если вам нужна чисто числовая строка, используйте что-то вроде: «первая цифра * 9» + «вторая цифра * 8» + «третья цифра * 7», что даст вам больше разнообразия.

Если вы этого не сделаете, используйте вышеуказанные методы со случайным числом.

В этом случае псевдорандом будет достаточно.

person Aaron Harun    schedule 01.03.2012
comment
Почему не первая цифра * 100 + вторая цифра * 10 + третья цифра? - person Mr Lister; 01.03.2012
comment
Это хорошая идея! Немного псевдослучайности, добавленной в смесь, вроде? - person CodeOrElse; 01.03.2012
comment
Я попробовал seed = gameid + x * 4444 + y * 2222 с ужасными повторяющимися результатами, совсем не случайными ... затем поменял 4444 на 1234 и 2222 на 5678, и это выглядит не очень хорошо.. :) - person CodeOrElse; 01.03.2012