在彩票系统内均匀分配奖品

时间:2011-05-30 16:19:48

标签: php

什么是在“三个人”中均匀分配数字的最佳方式?例如,假设我有300个东西,每个人得到100但是如果我有2个东西,那么前两个人得到1,而第三个人失去运气。最快的方法是什么?有时300数字将高达2,000,000,我不确定for()循环是否是最佳解决方案?

3 个答案:

答案 0 :(得分:3)

如果您的奖金由P个不可分割的单位组成,并且您有W个获胜者,那么每位获奖者将获得:

P / W

单元。

在您支付这些费用后,您将拥有

P % W

单位离开。如果这是零,你就完成了。如果这是P,则意味着您拥有的奖品多于奖品。你必须自己决定采取行动的方法......最简单的解决办法就是画出

P - W
从这些场合存放的一些融资基金中获取。

如果余数不是0或P,那么你必须自己决定最公平的事情是......可能会开始一个基金......

修改

发表评论后,您可以避免使用融资基金:

my @winners = get_list_of_winners(); # Sorted randomly or in some 'fair' order
my $base_prize = P / W;              # P and W defined as above
my $leftovers  = P % W;
for my $i (0 .. $#winners) {
    $winners[$i] = $base_prizel + ( ($i < $leftovers)?1:0 );
}

答案 1 :(得分:2)

我假设你的意思是你想在三个人之间平均分配剩余的部分。

首先,我将2,000,000除以3并向下舍入。 (我们称之为x)
然后需要2,000,000%(mod)3并找到结果。 (我们称之为y)

然后我会根据你拥有的人数创建一个数组 将每个元素设置为 x ,然后在0和 x-1 之间生成 y 随机数,并为每个索引添加一个< / p>

像这样:

<?php
$items = 2000000;
$winners = 3;
$x = floor($items / $winners);
$y = $item % $winners;
$distribution = $array();
$distribution = array_fill(0, $winners, $x);
for($i = 0; $i < $y; $i++)
{
$distribution[rand(0, $winners - 1)]++;
}
?>

现在你有一个数组与人数相同的数组,每个数组都填充了一些收到的项目。它可能不是偶数,但它是公平和随机的。

答案 2 :(得分:-1)

只需使用基于整数的数学运算。如果你只有两个奖品可以放弃,三个人可以获胜,没有人能赢得任何奖励。如果你遗留了任何东西,以至于你的奖品数量不能被获胜者的数量整除,那么你只剩下剩下的东西了。没有公平的方法,这是基本的数学。