Как получить значение, основанное на определенной вероятности

StackOverflow https://stackoverflow.com/questions/3572343

Вопрос

У меня есть некоторые функции, которые генерируют двойные, плавать, короткие, длинные случайные значения. У меня есть еще одна функция, к которой я передаю тип данных, и что должно вернуть случайное значение. Теперь мне нужно выбрать в этом функции возвращаемой стоимость на основе прошедшего данных DataType. Например, если я прохожу поплавок, мне нужно:

Вероятность того, что возвращение - это поплавок, составляет 70%, вероятность того, что возвращение двойной, короткий или длинный, составляет 10% каждый. Я могу сделать звонки другую функцию для создания соответствующих случайных значений, но как я могу вписаться в вероятностные веса для окончательного возврата? Мой код находится в C ++.

Некоторые указатели ценятся.

Спасибо.

Это было полезно?

Решение

C ++ случайные числа имеют равномерное распределение. Отказ Если тебе нужно случайные переменные другой распределение Вам нужно основывать свою математическую формулу на равномерное распределение.

Если у вас нет математической формулы для вашей случайной переменной, вы можете сделать что-то подобное:

int x = rand() % 10;
if (x < 7)
{
 // return float
}
else (if x == 7)
{
 // return double
}
else (if x == 8)
{
 // return short
}
else (if x == 9)
{
 // return long
}

Другие советы

Это может служить альтернативой для будущих ссылок, которые могут получить вероятность точных значений, таких как 99,999% или 0,0001%, чтобы получить вероятность (реальный процент) делать как таковые:

//70%
double probability = 0.7;
double result = rand() / RAND_MAX;
if(result < probability)
   //do something

Я использовал этот метод для создания очень больших перколятых решеток, и он работает как очарование для прецизионных значений.

Я не знаю, правильно ли я правильно понимаю то, что вы хотите сделать, но если вы просто хотите убедиться, что вероятностяки составляют 70-10-10-10, сделайте следующее:

  • генерировать случайное число r в (1,2,3,4,5,6,7,8,9,10)
  • если r <= 7: плавать
  • если r == 8: короткая
  • если r == 9: двойной
  • если r == 10: длинная

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

MMONEM имеет хороший вероятностный коммутатор, но возвращение разных типов либо не тривиально. Вам нужен один тип, который может адекватно (для ваших целей) кодировать любую из значений - проверить Boost :: Any, Boost :: Variant, Union или Convert в самый способный тип (вероятно, двойной) или строковое представление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top