Как получить значение, основанное на определенной вероятности - PullRequest
0 голосов
/ 26 августа 2010

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

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

Некоторые указатели приветствуются.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 26 августа 2010

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
}
3 голосов
/ 12 августа 2013

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

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

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

2 голосов
/ 26 августа 2010

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

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

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

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

mmonem имеет хороший вероятностный переключатель, но возвращать разные типы тоже не тривиально. Вам нужен единственный тип, который может адекватно (для ваших целей) кодировать любое из значений - проверьте boost :: any, boost :: variable, union или преобразовать в наиболее подходящий тип (возможно, double) или строковое представление.

...