我创建了一个脚本,用户可以通过完成任务获得积分,然后获得的积分越多,他们获得奖金的机会就越大.
它就像一个抽奖活动.
我的问题是产生赢家.
我可以选择一个随机获胜者,其代码如下:
function selectWinners($count){
$select = mysql_query("SELECT first_name from `users` ORDER BY RAND() LIMIT {$count}");
$results = mysql_fetch_assoc($select);
echo "Winner is {$results[first_name]}";
}
但这只是完全随机的,并且对于用户拥有多少点并不重要.
我相信我必须创建一个临时表,显示他们拥有的每个点的用户ID,然后使用类似的脚本来选择随机ID?
我不完全确定,只是一个猜测,我也不知道如何编码.
谢谢
解决方法:
你问的问题实际上是一个统计问题而不是编程问题.
您希望每个用户都有机会赢得他们所做的参赛人数(“积分”).在现实世界中,这相当于将每个用户的名字放入帽子中,每次获得一个点,然后随机绘制一个名称.单个图画命名为胜利者.
以编程方式,您可以通过选择零和在所有用户中获得的总分数减去一个之间的随机数来实现此目的(如果您愿意,可以从一个开始.但计算机使用零,这通常更容易).然后,您遍历用户,将每个点的总数添加到运行总和中.当运行计数超过您选择的随机数时,您当前所在的用户就赢了.
想象一下,你有三个参赛者,名叫乔,鲍勃和爱丽丝:
Name Points
------------
Joe 3
Bob 8
Alice 2
无论名称的顺序无关紧要,概率无论如何都会起作用.
您可以选择0到12之间的随机数(12 = 3 8 2-1).在0-2,乔获胜(2 = 3-1).在3-10,鲍勃获胜(10 = 8 3-1).在11-12,爱丽丝获胜(12 = 3 8 2-1).请注意,每个范围中包含的值的数量等于点的数量 – 因此,选择给定个体的几率是(个人的点/总点数),您想要的逻辑.
你检查胜利者的方式就像我上面所说的那样 – 在零开始一个总和,然后加3.如果3>随机值,乔赢了.然后添加8.如果新11大于随机值,则Bob获胜.然后添加2.现在该数字大于您的随机值(因为13高于您可以生成的最大值).
从理论上讲,这可以在一个数据库中完成 – 但它并不是一个真正适合的任务.这是应用程序逻辑,我建议在PHP中使用它(SQL只是所有用户的基本SELECT,他们的点,也许是总点数).
标签:php,mysql
来源: https://codeday.me/bug/20190716/1481419.html