Как сделать rand () более вероятным для выбора определенных чисел? - PullRequest
2 голосов
/ 29 августа 2010

Можно ли использовать rand () или любой другой псевдослучайный генератор для выбора случайных чисел, но есть ли вероятность, что он выберет определенные числа, которые пользователь вводит?Другими словами, есть ли способ, с помощью rand () или чего-то еще, выбрать псевдослучайное число, но иметь возможность регулировать шансы на получение определенных результатов и как это сделать, если это возможно.

Кстати, я просто спрашиваю, как изменить числа, выводимые rand (), а не как получить пользовательский ввод.

Ответы [ 8 ]

8 голосов
/ 29 августа 2010

Ну, ваш вопрос немного расплывчатый ... но если вы хотите выбрать число от 0 до 100, но с уклоном, скажем, для 43 и 27, вы можете выбрать число в диапазоне [0, 102] и сопоставьте 101–43 и 102–27. Это будет зависеть от того, какой уклон вы хотите указать, какой у вас диапазон и т. д.

3 голосов
/ 29 августа 2010

Вам нужна функция отображения между равномерной плотностью rand () и желаемой плотностью вероятности. Функция отображения может быть сделана множеством разных способов.

1 голос
/ 29 августа 2010

Другими словами, есть ли способ, с помощью rand () или чего-то еще, выбрать псевдослучайное число, но иметь возможность регулировать шансы на получение определенных результатов и как это сделать, если это возможно.

Для простоты давайте используем drand48(), который возвращает «значения, равномерно распределенные по интервалу [0.0,1.0)».

Чтобы более вероятно появление значений, близких к одному, примените функцию перекоса log2():

log2( drand48() + 1.0 );  // +1 since log2() in is [0.0, 1.0) for values in [1.0, 2.0)

Чтобы увеличить вероятность появления значений, близких к нулю, используйте, например, exp()

(exp(drand48()) - 1.0) * (1/(M_E-1.0));  // exp(0)=1, exp(1)=e

Как правило, вам необходимо создать функцию, которая бы отображала равномерно распределенные значения из случайной функции в значения, которые распределены по-разному, неравномерно.

1 голос
/ 29 августа 2010

Это не так уж сложно ..

просто создайте массив всех возможных чисел, а затем заполните массив дополнительными числами, которые вы хотите получить чаще.

т.е.:

массив ('1', 1 ',' 1 ',' 1 ',' 2 ',' 3 ',' 4 ',' 4 ');

Очевидно, что при запросемассив, он будет вызывать «1», а затем «4»

1 голос
/ 29 августа 2010

Вы можете, конечно, использовать любой генератор случайных чисел, чтобы искажать результаты. Пример в C #, так как я не знаю синтаксис target-c. Я предполагаю, что rand () возвращает число между 0 и 1, 0 включительно и 1 эксклюзивно. Должно быть довольно легко понять идеар и преобразовать код в любой другой язык.

 /// <summary>
 /// Dice roll with a double chance of rolling a 6.
 /// </summary>
 int SkewedDiceRoll()
 {
     // Set diceRool to a value from 1 to 7.
     int diceRool = Math.Floor(7 * rand()) + 1;

     // Treat a value of 7 as a 6.
     if (diceRoll == 7)
     {
         diceRoll = 6;
     }

     return diceRoll;
 }
0 голосов
/ 29 августа 2010

Вы можете использовать следующий трюк

0 голосов
/ 29 августа 2010

В дополнение к тому, что предложил Кевин, вы могли бы разделить свою обычную группу чисел (широкий диапазон) на несколько меньших диапазонов и выбрать из числа подходящего диапазона ГСЧ.Вы можете получить доступ к этим диапазонам в определенном порядке, или вы можете получить к ним доступ в некотором случайном порядке (но я могу предположить, что это не то, что вам нужно.) Поскольку вы используете указанные вручную диапазоны для доступа в широком диапазонеэлементов, вы, вероятно, увидите, что числа, которые вы хотите, всплывают больше, чем другие.Конечно, именно так я и подхожу, и это может показаться не столь рациональным.

Удачи.

0 голосов
/ 29 августа 2010

По определению выходной сигнал генератора случайных чисел является случайным, что означает, что каждое число с равной вероятностью будет происходить следующим (вероятность 1/10), и вы не сможете повлиять на результат.- конечно, генератор псевдослучайных данных создает выходные данные, которые всегда будут следовать одному и тому же шаблону для данного входного начального числа.Так что, если вы знаете начальное число, вы можете иметь некоторое представление о выходной последовательности.Конечно, вы можете использовать оператор модуля для воспроизведения набора чисел, выводимых из генератора (например,% 5 + 2 для генерации чисел от 2 до 7).

...