经典概率算法(用于彩票等场景)
假设有一个数组[100,400,200,300],表示总数为100+400+200+300=1000。得到第一个数的概率是 100/1000 ,得到第二个数的概率是 400/1000... 代码如下:
function getResult(arr){
var leng = 0;
for(var i=0; i<arr.length; i++){
leng+=arr[i] //获取总数
}
for(var i=0; i<arr.length; i++){
var random = parseInt(()*leng); //获取 0-总数 之间的一个随随机整数
if(random<arr[i]){
return i //如果在当前的概率范围内,得到的就是当前概率
}
else {
leng-=arr[i] //否则减去当前的概率范围,进入下一轮循环
}
}
}我们来解释一下这个算法,抽象出数组,假设 a, b , c ,d,这四个概率数,那么它们的和就是a+b+c+d。将其绘制为数轴:
![]()
从 0-(a+b+c+d) 中随机取一个数,该数将落入相应的空间中。就可以得到相应的概率。
第一次看数字的时候有两个选项:
a:
如果是第一个选项,直接就是概率a/(a+b+c+d),对应的结果是一个。直接返回。
如果是第二个选项,那么概率应该是(b+c+d)/(a+b+c+d),然后进入第二个循环。第二次取数时,减去概率空间a,得到新的数轴:
![]()
新的数轴以原来的a为0的原点,其余不变。此时总和变为b+c+d。
从 0-(b+c+d) 中选择一个随机数。如果数字落入相应的空间,则得到相应的概率。
也有两种选择:
b
如果是第一种,那么它的概率是b/(b+c+d)。请注意,此概率的假设是第一个结果>a,因此总概率是两次的乘积:(b+c+d)/(a+b+c+d) * b/(b+ c +d)。结果为 b/(a+b+c+d) ,对应的结果为 b。返回。
如果是第二种,则其概率为 (c+d)/(b+c+d) 。同样,如果一个结果 >a 同时发生,则这种情况的总概率应该是: (b+c+d)/(a+b+c+d) * (c+d)/(b+ c+d)结果是(c+d)/(a+b+c+d)。然后进入第三个循环,在第三个循环中我们减去概率空间b...以此类推...........
这样一直可以得到概率值,直到最后。 ..
这个算法可以用在彩票中,有一组中奖和相应的概率:
var gifts = [
{
"name":"mac",
"prop":1
},
{
"name":"红米",
"prop":10
},
{
"name":"u盘",
"prop":40
},
{
"name":"香皂",
"prop":49
}
];你可以使用前面的函数来抽奖:
var gArr = [];
for(var i=0; i<gifts.length; i++){
(gifts[i]['prop'])
}
(gifts[getResult(gArr)]['name']) 版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网