Home  >  Article  >  Backend Development  >  求大神指点

求大神指点

WBOY
WBOYOriginal
2016-06-23 13:39:55850browse

一个抽奖的需求:
一等奖1000个,二等奖30万个,三等奖30万个。如何快速的随机抛出一个奖品?我用了数组,把奖品放到数组里面,然后随机抛出一个,这种方式感觉有点慢,需要1到2秒的时间才能得到一个奖品。有没有别的方法,求大神指点?


回复讨论(解决方案)

大神都回去过年了吗,坐等指点!

测试例

$ar = array(1 => 1000, 2 => 300000, 3 => 300000); //奖池while(array_sum($ar)) {  $n = get_rand($ar); //得到奖项级别,可打印出来看看分布情况  @$res[$n]++;}print_r($res);//看看中奖分布print_r($ar); //看看奖池是否有剩余function get_rand(&$proArr) {  $proSum = array_sum($proArr);  $randNum = mt_rand(1, $proSum);  foreach($proArr as $key => $proCur) {    $proSum -= $proCur;    if($randNum > $proSum) {      $proArr[$key]--; //从奖池里扣除      return $key;    }  }}
Array(    [2] => 300000    [3] => 300000    [1] => 1000)Array(    [1] => 0    [2] => 0    [3] => 0)

实用时,你需要保存奖池的变化,以供下一次抽奖使用

如果是我...把用户或者抽奖码放进数据库,在后面加一个字段“中奖状态”,0=没中,1=一等奖...
每次使用sql的随机语句抽出一个中奖状态为0的用户,然后更新即可

如果是按概率抽奖的

$ar = array(1 => 10, 2 => 30, 3 => 60); //中奖概率for($i=0; $i<10000; $i++) { //抽奖1万次  $n = get_rand($ar); //得到奖项级别,可打印出来看看分布情况  @$res[$n]++;}print_r($res);//看看中奖分布function get_rand(&$proArr) {  $proSum = array_sum($proArr);  $randNum = mt_rand(1, $proSum);  foreach($proArr as $key => $proCur) {    $proSum -= $proCur;    if($randNum > $proSum) {      //$proArr[$key]--; //从奖池里扣除 因为是概率抽奖,这一句就不要了      return $key;    }  }}
可能的结果
Array(    [3] => 5955    [2] => 3059    [1] => 986)

大神都回去过年了吗,坐等指点!




和这个方法的思路差不多!

测试例

$ar = array(1 => 1000, 2 => 300000, 3 => 300000); //奖池while(array_sum($ar)) {  $n = get_rand($ar); //得到奖项级别,可打印出来看看分布情况  @$res[$n]++;}print_r($res);//看看中奖分布print_r($ar); //看看奖池是否有剩余function get_rand(&$proArr) {  $proSum = array_sum($proArr);  $randNum = mt_rand(1, $proSum);  foreach($proArr as $key => $proCur) {    $proSum -= $proCur;    if($randNum > $proSum) {      $proArr[$key]--; //从奖池里扣除      return $key;    }  }}
Array(    [2] => 300000    [3] => 300000    [1] => 1000)Array(    [1] => 0    [2] => 0    [3] => 0)

实用时,你需要保存奖池的变化,以供下一次抽奖使用




擦,引用错了!!!!!
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn