最便宜网站推广公司产品
我即将创建“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] -
";
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)];
我确信有一种更有效的方法可以使用数学来做到这一点,但我需要考虑一下……
标签:php,mysql
来源: https://codeday.me/bug/20190611/1220909.html