PHP和JavaScript中奖概率算法

这是一个经典的概率算法。

现在有数组:[10, 20, 30, 40] 。

假设对应中奖几率:特等奖10%,一等奖20%,二等奖30%,三等奖40%,总共100%。

算法开始时,从数组中选出一个值$value,再从1-100概率空间内随机选出一个数$rand。

比较$value和$rand,如果$rand在$value概率范围之内,则直接返回$value对应的key。

如果不在,则将概率空间的值减去$value值。

在本例中,第一次判断之后,就是减去10,也就是说第二次是在1-90这个范围内筛选的。

这样筛选到最后,总会有一个数满足要求。

就相当于去一个箱子里摸东西,

第一个不是,第二个不是,第三个还不是,那最后一个一定是。

这个算法简单,而且效率非常高。

1 PHP实现

<?php

function getRand($arr)

{

$result = '';

//概率数组的总概率精度

$sum = array_sum($arr);

//概率数组循环

foreach ($arr as $key => $value) {

$rand = mt_rand(1, $sum);

if ($rand <= $value) {

$result = $key;

break;

} else {

$sum -= $value;

}

}

unset ($arr);

return $result;

}

使用范例:

$a = [10, 20, 30, 40];

// 输出3的概率最大

echo 'PHP:' . getRand($a);

2 Javascript实现

<script>

function getRand(arr) {

var result = 0;

var sum = arr.reduce(function(a, b) {

return a + b;

});

for (index in arr) {

rand = Math.round(Math.random() * (sum - 1) + 1);

if (rand <= arr[index]) {

return index;

} else {

sum -= arr[index];

}

}

return result;

}

// 使用示例,输出2的概率最大

var a = [10, 20, 30, 40];

document.write('<br />Javascript:' + getRand(a));

</script>

使用范例:

    // 使用示例,输出3的概率最大

var a = [10, 20, 30, 40];

document.write('<br />Javascript:' + getRand(a));

 

参考资料:

  1. PHP中奖概率算法
  2. Javascript数组操作

以上是 PHP和JavaScript中奖概率算法 的全部内容, 来源链接: utcz.com/z/334539.html

回到顶部