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.)
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)
这样的事情.
小智 9
Boost随机数库提供了为生成器指定不同形状分布的功能.这是一个很棒的图书馆 - 请参阅http://www.boost.org/doc/libs/1_42_0/libs/random/index.html.
您所描述的是从特定概率分布中提取的随机数生成器的实现.例如,从高斯分布中绘制数字应该绘制随机数,使得特定绘制的概率x与替代文本http://upload.wikimedia.org/math/1/8/4/184fa5540b76903b1653d9f83912265d.png成比例.
通常,该方法是从均匀随机分布中提取,然后在该绘制位置选择所需分布的累积分布函数(CDF)的值.在普通高斯的情况下,从均匀分布中绘制一个随机数x(这是标准随机数生成器应该给出的)然后选择
作为随机的高斯分布值.对于您的情况,您描述的CDF是一个分段连续的阶梯功能,可以使用您已经收到的许多(正确)答案中的任何一个来实现.
当然,这都是琐事.您应该做的是使用已经为您处理此问题的库.统计和随机数生成并非无足轻重,也无需重新发明轮子.请参阅Neil的答案(并查看Boost 随机数库).