Code前端首页关于Code前端联系我们

经典概率算法(用于彩票等场景)

terry 2年前 (2023-09-27) 阅读数 62 #数据结构与算法

假设有一个数组[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前端网发表,如需转载,请注明页面地址。

热门