Генератор случайных чисел вероятности - PullRequest
17 голосов
/ 10 июня 2010

Допустим, я пишу простую игру на удачу - каждый игрок нажимает Enter, и игра назначает ему случайное число от 1 до 6. Прямо как куб. В конце игры побеждает игрок с наибольшим числом.

Теперь, допустим, я мошенник. Я хочу написать игру, чтобы у игрока # 1 (который будет у меня) была вероятность 90% получить шесть, и 2% получить каждое из остальных чисел (1, 2, 3, 4, 5).

Как я могу сгенерировать случайное число и установить вероятность для каждого числа?

Ответы [ 3 ]

21 голосов
/ 10 июня 2010
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;
}
3 голосов
/ 10 июня 2010

У вас есть несколько вариантов, но одним из способов было бы вытянуть число от 1 до 100 и использовать ваши веса, чтобы присвоить его номеру кости кости.

Так

1,2 = 1
3,4 = 2
5,6 = 3
7,8 = 4
9,10 = 5
11-100 = 6

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

2 голосов
/ 10 июня 2010

Вы можете определить массив распределения (псевдокод):

// справедливое распространение

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;
}

это номер кости.

Теперь, если вы хотите обмануть, измените массив на:

array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 };

и у вас будет 50%, чтобы получить 6 (вместо 16%)

...