В зависимости от вашей реальной цели использование жестко закодированной таблицы «случайного» выбора может быть хорошим вариантом.Это хороший выбор для игр, в которых геймплей выиграет от правильного предсказания следующего выбора (например, «тупые враги-роботы» с фиксированным поведением, таким как «Левый», «Левый», «Правый», «Левый», «Повторить»).
В качестве альтернативы, чтобы получить «истинно случайный с человеческой точки зрения», вы можете подсчитать, как часто в последнее время происходит определенный выбор, и если он превышает пороговое значение, принудительно выбирайте другой выбор (и счетчики сброса).Более сложный подход был бы выбором веса на основе некоторых предыдущих результатов.
Вот пример, который будет генерировать не более 3 одинаковых значений подряд:
class NiceRandom
{
static Random rand = new Random();
int count = 0;
int prevChoice = -1;
public int Next()
{
int r = rand.Next(0,2);
if (r == prevChoice)
{
count++;
// switch our "random" result if there are 3 of the same rolls
r = count < 3 ? r : (r == 0 ? 1 : 0);
}
if (r != prevChoice)
{
// reset count if we roll other value.
prevChoice = r;
count = 0;
}
return r;
}
}
Предупреждение: сделать "случайным"«числа, которые ведут себя по-разному, чтобы казаться более« естественными »(как приведенный выше код), скорее всего, приведут к тому, что распределения больше не будут равномерными / случайными - убедитесь, что результат выглядит хорошо для вашей игры / приложения, и вам действительно не нужна истинная случайность.Вы можете проверить требования к случайности для игровых автоматов Какой тип генератора случайных чисел используется в игровой индустрии казино? , чтобы узнать больше.