怎样按概率产生随机数? 请教一个问题:已知一个数组(N个元素),其中每个数对应一个权值,怎样在该数组中随机选择M(M<N)个元素,但是要使权值更大的元素有更大的概率被选中,应该怎样考虑呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 举个例子:数字 权值1 5%2 15%3 30%4 50%随机产生一个0到1的小数if随机数<=0.05 就取1else if 随机数>0.05 && 随机数<=0.05+0.15 就取2依此类推 根据权值计算出每个数相应的概率,如Qi/(Q1+Q2+..+Qn)然后寻找方法使得随机结果按这个概率分布 按6楼的办法得出概率0然后求1/p比如是13/29那你就判断(random()*29)<13 也就说是判断 生成的随机数是否 < 1/p?为什么呢? 弄的复杂了..其实就是小于p...因为随机函数都是[0,1)范围的...小于p(0<p<1)的概率刚好就是p... 参考各位的方法,能否这样:1 计算每个数对应的概率:Pi=Qi/(Q1+Q2+…+Qn)(由于权值Qi是降序排列,Pi也是降序排列)2 取[0,1]之间随机数rand3 判断rand在哪个区间: [0,P1] (P1,P1+P2] (P1+P2,P1+P2+P3] … (P1+P2+…Pn-1,1]4 rand在哪个区间则取相对应的数 int[] map ={ 1, // 1 2,2,2,2, // 4 3,3,3,3,3,3,3,3,3, // 9 ......};int n = 1 + 4 + 9 + 16 + 25 + 36 + 49 + 64 + 81 + 100;Random r = new Random();return map[r.nextInt(n)]; 遇到一个令人受不了的开源项目 关于GridView 使用WebService能实现跨域登录么? 关于一个模块中有很多类别,在一个页面上全部显示,那种实现方式比较好? 窗口捕获问题,简单!送分啦!!! 前面都加了public了,可是还提示"可访问性不一致: 字段类型..” 打包问题 虚函数和抽象函数在使用上的区别是什么? 这个结构体在C#中应该怎么写? 欢迎大家谈谈.NET 互操作性 C#读取文件 C#实现FTP的问题
数字 权值
1 5%
2 15%
3 30%
4 50%随机产生一个0到1的小数
if随机数<=0.05 就取1
else if 随机数>0.05 && 随机数<=0.05+0.15 就取2
依此类推
然后寻找方法使得随机结果按这个概率分布
然后求1/p
比如是13/29
那你就判断(random()*29)<13
也就说是判断 生成的随机数是否 < 1/p?
为什么呢?
其实就是小于p...
因为随机函数都是[0,1)范围的...
小于p(0<p<1)的概率刚好就是p...
1 计算每个数对应的概率:Pi=Qi/(Q1+Q2+…+Qn)(由于权值Qi是降序排列,Pi也是降序排列)
2 取[0,1]之间随机数rand
3 判断rand在哪个区间:
[0,P1]
(P1,P1+P2]
(P1+P2,P1+P2+P3]
…
(P1+P2+…Pn-1,1]
4 rand在哪个区间则取相对应的数
int[] map =
{
1, // 1
2,2,2,2, // 4
3,3,3,3,3,3,3,3,3, // 9
......
};int n = 1 + 4 + 9 + 16 + 25 + 36 + 49 + 64 + 81 + 100;Random r = new Random();return map[r.nextInt(n)];