@Almost

Как правильно сделать разные генераторы рандома?

Допустим в начале игры каждый раз генерируется карта.
Генерация зависит от рандома.
Чтобы сделать генерацию повторяющууся используется одинаковый сид в начале генерации.

Для примера, после генерации наносится урон сущности, зависимый от рандома, и этот урон каждый раз будет одинаковый, т.к. перед генерацией использовался сид.

Пример:
spoiler
Random.InitState(10);

for (int i = 0; i < 3; i++)
{
	Debug.Log($"GENERATION : {Random.Range(0f, 1f)}");
}
			
for (int i = 0; i < 3; i++)
{
	Debug.Log($"SHOOT : {Random.Range(0f, 1f)}");
}


Вывод каждый раз одинаковый:
GENERATION : 0.2686557
GENERATION : 0.7817978
GENERATION : 0.9014543

SHOOT : 0.3051965
SHOOT : 0.8728517
SHOOT : 0.2956414

Как правильно сделать, чтобы этот урон не зависил от сида, который был установлен в начале генерации?

Было найдено решение, в котором перед генерацией (или перед первой установкой сида) мы генерируем сид для урона, который будет устанавливаться перед нанесением урона и обновляться на новый после урона, чтобы урон не повторялся, но данное решение не выглядит что-ли правильным и системным.

Пример:
spoiler
var shootSeed = Random.Range(int.MinValue, int.MaxValue);
Random.InitState(10);

for (int i = 0; i < 3; i++)
{
	Debug.Log($"GENERATION : {Random.Range(0f, 1f)}");
}
			
for (int i = 0; i < 3; i++)
{
	Random.InitState(shootSeed);
	Debug.Log($"SHOOT : {Random.Range(0f, 1f)}");
	shootSeed = Random.Range(int.MinValue, int.MaxValue);
}


Выводы:

1)
GENERATION : 0.2686557
GENERATION : 0.7817978
GENERATION : 0.9014543

SHOT : 0.4784655
SHOT : 0.2666625
SHOT : 0.5826535

2)
GENERATION : 0.2686557
GENERATION : 0.7817978
GENERATION : 0.9014543

SHOT : 0.7529675
SHOT : 0.8416272
SHOT : 0.09183574

и т.д.


Вроде двигаюсь в верном направлении, но не до конца понимаю.
Еще остается вопрос как продолжить вызов рандома, зависимый от сида для генерации после стрельбы. Запоминать количество вызовов рандома для генерации, генерировать мусорные рандомы и потом получать нужное значение? Кажется что это оверхед.
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
GavriKos
@GavriKos Куратор тега Unity
Используйте не юнитевый, а шарповый рандом - из пространства System. Он умеет в инстансы с разным сидом
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы