Понимание генерации случайных чисел

Я создаю игру, в которой я хочу создать случайные миры и дать игроку возможность снова создать тот же мир, введя то же семя... Итак... Как я могу это сделать? Он будет генерировать один и тот же набор чисел, но не каждый раз, когда вы вызываете случайную функцию...

Должен ли я вручную создавать функции сортов на основе семени?


person Ledii    schedule 14.04.2015    source источник
comment
Хорошим примером того, чего я хочу, является то, как это делают миры Minecraft...   -  person Ledii    schedule 14.04.2015
comment
Понимание того, как генерируются случайные числа на выбранном вами языке/фреймворке, было бы хорошим началом и позволило бы вам улучшить свой вопрос.   -  person Alexei Levenkov    schedule 14.04.2015
comment
Спасибо за совет. вроде устал, как я делал всю ночь.   -  person Ledii    schedule 14.04.2015


Ответы (2)


В GameMaker Studio и GameMaker 8.1 есть функция: random_set_seed(seed)

Здесь вы можете ввести свой seed. Тогда random(x) дает один и тот же n-й результат за прогон игры.

random(100)
randomize() // This doesn't change rand[0] or rand[1]

random_set_seed(20) // because of this
rand[0]=random(100)
rand[1]=random(100)
person 1pietras    schedule 17.04.2015

Функции рандомизатора либо используют математические формулы, которые выдают случайные числа, либо просто смотрят на уже рассчитанный массив кажущихся случайными чисел и возвращают их по порядку. В большинстве языков есть функция, которая смотрит на часы компьютера и использует это значение в качестве первого значения для математической формулы или в качестве начального индекса в псевдослучайном массиве. В GameMaker для этого можно использовать randomize(). Вызовите это только один раз при запуске игры, и вы будете получать разные результаты при каждом выполнении.

Если вы хотите наоборот, то есть хотите иметь возможность регенерировать ту же, казалось бы, случайную последовательность, вы можете вместо этого установить начальное число вручную с помощью random_set_seed(value). Передаваемое значение должно быть числом. Затем вы можете отдать это семя игроку.

Итак, если вы хотите сгенерировать случайный уровень в первый раз, а позже иметь возможность переиграть тот же уровень, вам нужно сделать по порядку:

  • Вызовите randomize, чтобы установить случайное начальное число.
  • Вызовите random_get_seed, который вернет текущее семя.
  • Позвоните random и тому подобное, чтобы сгенерировать уровень.
  • Когда игрок хочет использовать то же семя, что и раньше, вызовите random_set_seed и передайте ему семя.

Предупреждение: Используя эти функции, вы доверяете функциям рандомизации GM. Они зависят от платформы, и функции могут измениться в более поздней версии GM. Если вы хотите, чтобы ваши сиды работали на всех платформах и версиях вашей игры, вы можете поработать над собственными функциями рандомизации.

person Domino    schedule 19.04.2015
comment
Спасибо за ответы .. Однако я не нашел ответа, который ищу здесь! Скажем, у вас есть кнопка «Создать мир» и ввод для начального числа. Каждый раз, когда вы нажимаете «Создать мир» (независимо от того, сколько вызовов random() перед ним), необходимо каждый раз создавать один и тот же мир. Это не когда я пытаюсь... - person Ledii; 25.04.2015