本示例代码是一段经典的几率算法,$probability是一个预先设置的数组,假设数组为:array(10,20,30,40),
开始是从1,100这个几率范围内筛选第一个数是否在他的出现几率范围以内,
若是不在,则将几率空间,也就是k的值减去刚刚的那个数字的几率空间,在本例当中就是减去100,
也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数知足要求。
就至关于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个必定是。
这个算法简单,并且效率很是高,关键是这个算法已在咱们之前的项目中有应用,尤为是大数据量的项目中效率很是棒。
PHP+jQuery实现翻板抽奖Demophp
<?php /** * 几率算法 * @param array $probability * @return integer|string */ function get_rand($probability) { // 几率数组的总几率精度 $max = array_sum($probability); foreach ($probability as $key => $val) { $rand_number = mt_rand(1, $max); if ($rand_number <= $val) { return $key; } else { $max -= $val; } } } // 几率比例 /* 接下来咱们经过PHP配置奖项。 */ $data = array( array( "平板电脑","prob"=>1 ), array( "数码相机","prob"=>3 ), array( "音箱设备","prob"=>6 ), array( "8G优盘","prob"=>20 ), array( "10Q币","prob"=>25 ), array( "prize"=>"下次没准就能中噢","prob"=>50 ) ); |
$data中是一个二维数组,记录了全部本次抽奖的奖项信息,其中prize表示奖品,prob表示中奖几率。注意其中的prob必须为整数
你能够将对应的奖项的prob设置成0,即意味着该奖项抽中的概率是0
数组中prob的总和(基数),基数越大越能体现几率的准确性。
本例中prob的总和为100,那么平板电脑对应的中奖几率就是1%,若是prob的总和是1000,那中奖几率就是千分之一了。算法
<?php foreach ($data as $key=>$val) unset($data[$n]); // 将中奖项从数组中剔除,剩下未中奖项 //$res['no'] = array_map(function($x){return $x[0];}, $data); // 除了中奖外的其余数据 echo json_encode($res);code |