Смещенная функция генератора случайных чисел в C - PullRequest
0 голосов
/ 24 сентября 2018

Попытка создать следующую функцию в C:

bool randBool(double bias)

, которая возвращает либо 0, либо 1 в случайном порядке.

Часть, которая вызывает меня, состоит в том, что я быхотел бы позволить пользователю вводить «смещение» в диапазоне [-1.0, 1.0], которое представляет вероятность того, что на выходе будет 0 или 1.

Вот несколько примерово том, как введенное смещение должно влиять на функцию:

======================================================

randBool(-1.0) должно возвращаться 0 100% времени.

randBool(1.0)должен возвращать 1 100% времени.

randBool(-0.5) с вероятностью 50% вернется 0, чем 1.

randBool(0.05) с вероятностью 5%return 1 чем 0.

randBool(0.0) с большей вероятностью вернет 0, чем 1.

=============================================================

IЯ почти уверен, что это проблема вероятности, но я не очень знаком с этой темой, поэтому я нахожусь в тупикеw для реализации этой функции.

1 Ответ

0 голосов
/ 24 сентября 2018

Примерно так:

bool randBool(double bias) {
    return rand() < ((RAND_MAX + 1.0) * ((bias + 1) / 2));
}

Часть ((bias + 1) / 2) предназначена для получения смещения в диапазоне [0,1] вместо [-1,1].Этого можно было бы избежать, если параметр bias изменяется так, чтобы он уже находился в диапазоне [0,1].

Смещение затем определяется как вероятность возврата 1.С:

  • 0.0 (соответствует вашему смещению -1.0): все нули
  • 0.25 (соответствует вашему смещению -0.5): 25% единиц, 75% нулей
  • 0.5 (соответствует вашему смещению 0.0): четное сочетание единиц и нулей
  • 0.525 (соответствует вашему смещению 0.05): 52,5% единиц,47,5% нулей
  • 1.0 (соответствует вашему смещению 1.0): все единицы

ПРИМЕЧАНИЯ к RAND_MAX

  • Если RAND_MAX < INT_MAX, то вместо 1041 * можно использовать RAND_MAX + 1.

  • Если RAND_MAX + 1.0 не может быть представлен double без округления (ссылка Все ли целые значения идеально представлены в виде двойных чисел? ), то представленное решение не является надежным.
    Подход на таких платформах может состоять в том, чтобы масштабировать результат rand() до диапазона, который может быть представлен либо int, либо double (в зависимости от того, используете ли вы RAND_MAX + 1 или RAND_MAX + 1.0).
    Или, в качестве альтернативы, используйте другой генератор случайных чисел (у которого нет этой проблемы), что, вероятно, в любом случае является хорошей идеей, учитывая множество низкокачественных реализаций rand().

...