加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

按重量选择随机值php

发布时间:2020-12-13 17:49:35 所属栏目:PHP教程 来源:网络整理
导读:我即将创建“lottary系统”. 看看我的桌子: userid-lottaryid-amount1 -------- 1 ---- 12 -------- 1 ---- 103 -------- 1 ---- 154 -------- 1 ---- 20 我想选择一个胜利者.另一个人获得第二名. 我无法随机选择获胜者,因为第四位用户有20张门票而第一位用
我即将创建“lottary系统”.

看看我的桌子:

userid-lottaryid-amount
1 -------- 1 ----  1
2 -------- 1 ---- 10
3 -------- 1 ---- 15
4 -------- 1 ---- 20

我想选择一个胜利者.另一个人获得第二名.

我无法随机选择获胜者,因为第四位用户有20张门票而第一位用户只有一张.
因此,我需要按重量生成随机结果,以便更公平.

我发现下面的PHP功能,但我无法弄清楚如何使用它.

function weighted_random_simple($values,$weights){ 
      $count = count($values); 
      $i = 0; 
      $n = 0; 
      $num = mt_rand(0,array_sum($weights)); 

      while($i < $count){
          $n += $weights[$i]; 
          if($n >= $num){
              break; 
          }
          $i++; 
      } 
      return $values[$i]; 

  }

    $values = array('1','10','20','100');
    $weights = array(1,10,20,100);

    echo weighted_random_simple($values,$weights);

我必须将userid colomn作为数组提取到$values并将colomn的数量提取到$weights.但我不敢.

到目前为止,这是我的代码:

$query = $handler->prepare("SELECT 

      `cvu`.`lottaryid` as `lottaryid`,`cvu`.`userid` as `userid`,`cvu`.`amount` as `amount`,`members`.`id` as `members_memberid`,`members`.`username` as `username`

      FROM `lottariesandmembers` as `cvu`

      LEFT JOIN `members` as `members` ON `cvu`.`userid` = `members`.`id`  WHERE `cvu`.`lottaryid` = 2");
    $query->bindParam(':lottaryid',$lottaryid,PDO::PARAM_INT);
    $query->execute();



    while($r = $query->fetch()) {

        for ( $count=1 ; $count <= $r["amount"] ; $count++ ) {

            $abcprint = "$r[userid].$count - $r[username] - <br>";

            echo "$abcprint";

        }


    }

这个代码我只列出了用户数量.例如:

1.1 user1
2.1 user2
2.2 user2
2.3 user2
..
2.10 user2
3.1 user3
..
3.15 user3
4.1 user4
..
4.20 user4

等等.但我仍然坚持如何在该名单上挑选一名获胜者.

如果你想帮助我,我想合并这些代码并创建这个小脚本.

如果你在另一方面看到解决方案,我也会开放头脑风暴.

解决方法

您可以只构建一个大型数组,然后从该数组中随机选择一个值,而不是像您一样打印出值.

while($r = $query->fetch()) {
    for ( $i=0; $i <= $r["amount"]; $i++ ) {
        // Add the user into the array as many times as they have tickets
        $tickets[] = $r['userid'];
    }
}

// select the first place winner
$first = $tickets[mt_rand(0,count($tickets) - 1)];

// remove the first place winner from the array
$tickets = array_values(array_filter($tickets,function($x) use ($first) { 
    return $x != $first; 
}));

// select the second place winner
$second = $tickets[mt_rand(0,count($tickets) - 1)];

我确信有一种更有效的方法可以使用数学来做到这一点,但我需要考虑一下……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读