偏置随机数发生器

cmp*_*rer 7 c++ random

我正在寻找一个可以有偏见的随机数发生器.例如,假设我想要1-5之间的随机数,概率为:

1:上升20%的时间
2:上升10%的时间
3:上升40%的时间
4:上升25%的时间
5:上升5%的时间

标准库或其他库中是否有可以执行此操作的内容?或者,有没有一种有效的方法来做到这一点?

ken*_*ytm 16

对于您的问题,只需从此列表中统一选择一个随机元素:

[1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5]
Run Code Online (Sandbox Code Playgroud)

一般来说,检查这个答案:加权随机数


在TR1和C++ 0x中,有一个<random>标题包含生成这些数字的discrete_distribution.

您可能还想查看包含比标准库更多的随机分布(和随机数生成器)的GSL <random>.(但请注意,GSL使用GPLv3.)

  • 这就是为什么良好的工程需要一套适当的要求.你问了一个简单的案例,你得到了(正确的)简单答案. (8认同)
  • 也许我应该更好地解释一下我的实际情况.我真正需要的是一个介于1-50,000之间的随机数.创建一个长期似乎不必要且不需要的列表.对困惑感到抱歉. (3认同)

Aar*_*onM 13

最好的方法可能就是采用正常的无偏随机生成器,然后根据其值落入的间隔返回.

只是一个if语句给出1为0:0.2,2为0.2:0.3,3为0.3:0.7,4为0.7:0.95和5为0.95:1.最好使间隔的下限或上限包含在内,而另一个则不包括.

int biasedRandom(){
double i = randomNumber();
if(i<= 0.2){return 1;}
else if(i <= 0.3){return 2;}
else if(i <= 0.7){return 3;}
else if(i <= 0.95){return 4;}
else{return 5;}
}
Run Code Online (Sandbox Code Playgroud)

这样的事情.

  • 如果你有很多间隔要检查,你应该做的是提出一个累积分布数组(不知道该怎么称呼它)并且每次都对它进行二进制搜索以找到生成的数字. (2认同)
  • 好像这个发电机总是会返回5.除非randomNumber()返回值0-1,否则需要双/浮点数和其他一些数学运算. (2认同)

小智 9

Boost随机数库提供了为生成器指定不同形状分布的功能.这是一个很棒的图书馆 - 请参阅http://www.boost.org/doc/libs/1_42_0/libs/random/index.html.

  • 总有一天我会开始使用Boost.有一天. (5认同)

Bar*_*ark 5

您所描述的是从特定概率分布中提取的随机数生成器的实现.例如,从高斯分布中绘制数字应该绘制随机数,使得特定绘制的概率x替代文本http://upload.wikimedia.org/math/1/8/4/184fa5540b76903b1653d9f83912265d.png成比例.

通常,该方法是从均匀随机分布中提取,然后在该绘制位置选择所需分布的累积分布函数(CDF)的值.在普通高斯的情况下,从均匀分布中绘制一个随机数x(这是标准随机数生成器应该给出的)然后选择替代文字作为随机的高斯分布值.对于您的情况,您描述的CDF是一个分段连续的阶梯功能,可以使用您已经收到的许多(正确)答案中的任何一个来实现.

当然,这都是琐事.您应该做的是使用已经为您处理此问题的库.统计和随机数生成并非无足轻重,也无需重新发明轮子.请参阅Neil的答案(并查看Boost 随机数库).