Генератор случайных чисел вероятностей
Скажем, я пишу простую игру удачи - каждый игрок нажимает Enter, и игра назначает ему случайное число между 1-6. Как куб. В конце игры выигрывает игрок с наибольшим количеством очков.
Теперь, скажем, я мошенник. Я хочу написать игру, поэтому игрок №1 (который будет мной) имеет вероятность 90% получить шесть и 2%, чтобы получить каждый из остальных номеров (1, 2, 3, 4, 5).
Как я могу сгенерировать число случайным и установить вероятность для каждого числа?
Ответы
Ответ 1
static Random random = new Random();
static int CheatToWin()
{
if (random.NextDouble() < 0.9)
return 6;
return random.Next(1, 6);
}
Другой настраиваемый способ обмана:
static int IfYouAintCheatinYouAintTryin()
{
List<Tuple<double, int>> iAlwaysWin = new List<Tuple<double, int>>();
iAlwaysWin.Add(new Tuple<double, int>(0.02, 1));
iAlwaysWin.Add(new Tuple<double, int>(0.04, 2));
iAlwaysWin.Add(new Tuple<double, int>(0.06, 3));
iAlwaysWin.Add(new Tuple<double, int>(0.08, 4));
iAlwaysWin.Add(new Tuple<double, int>(0.10, 5));
iAlwaysWin.Add(new Tuple<double, int>(1.00, 6));
double realRoll = random.NextDouble(); // same random object as before
foreach (var cheater in iAlwaysWin)
{
if (cheater.Item1 > realRoll)
return cheater.Item2;
}
return 6;
}
Ответ 2
У вас есть несколько вариантов, но один из способов - вывести число от 1 до 100 и использовать ваши веса, чтобы назначить это номер лица в кости.
Итак,
1,2 = 1
3,4 = 2
5,6 = 3
7,8 = 4
9,10 = 5
11-100 = 6
это даст вам необходимые вам коэффициенты, а также будет довольно легко настроить позже.
Ответ 3
вы можете определить массив распределения (псевдокод):
//справедливое распределение
array = {0.1666, 0.1666, 0.1666, 0.1666, 0.1666, 0.1666 };
тогда сверните кости с 0 на 1, сохраните на x, затем сделайте
float sum = 0;
for (int i = 0; i < 6;i++)
{
sum += array[i];
if (sum > x) break;
}
i - число в кости.
теперь, если вы хотите обмануть массив изменений:
array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 };
и у вас будет 50%, чтобы получить 6 (вместо 16%)