PHP彩票机会

时间:2011-10-10 08:54:45

标签: php

我正在制作一个彩票脚本,从5个用户的列表中选择一个随机的。我的问题是,有些用户必须有50%的获胜机会。

例如

bob - 1 chance
rob - 1.5 chance
mike - 1 chance
john - 1 chance
todd - 1.5 chance

我怎样才能做到这一点?我正在考虑构建一个数组并使用array_rand来获得一个随机用户,但我不知道如何分配机会。

由于

6 个答案:

答案 0 :(得分:4)

将您的列表更改为

bob - 1 chance 
bob - 1 chance 
rob - 1.5 chance 
rob - 1.5 chance 
rob - 1.5 chance 
mike - 1 chance 
mike - 1 chance 
john - 1 chance 
john - 1 chance 
todd - 1.5 chance 
todd - 1.5 chance 

然后当你从这个列表中选择一个时,有些人获胜的机会更好或更差。

答案 1 :(得分:4)

对于这样的不均匀分布,方法如下:

将所有权重加在一起,得到总数。这是您将用作随机数上限的数字。在您的示例中,这将是6。

现在构建一个数组,每个元素都包含数组中它下面所有元素的总和(排序顺序无关紧要)。

因此你会得到一个这样的数组:

bob = 1
rob = 2.5
mike = 3.5
john = 4.5
todd = 6

现在你可以得到随机数,然后选择得分小于随机数的最高数组元素。

无论权重多么不均衡,这都会为您提供加权随机性。

答案 2 :(得分:0)

通过改变你可能意味着机会。 那么,你可以做的是创建一个拥有用户的数组:

$boughtLotteryTicket = array('bob', 'rob', 'rob', 'mike', 'john', 'todd', 'todd');

做任何你想做的事:)。既然你加了两次,他们都有两倍的胜利可能性。 参与任何彩票时的原则相同。购买更多门票==更高的获胜变化。

答案 3 :(得分:0)

总结所有加权变​​化的机会:

$sum =$pSum = 0;
foreach($users as $participant)
    $sum += $participant['change'];

$rand = rand()/get_randmax();
foreach($users as $participant) {
    $pSum += $participant['change']/$sum;
    if($pSum > $rand) {
        $winner = $participant;
        break;
    }
}

答案 4 :(得分:0)

这不太可能是处理它的最好方法,但是为了得到这么小的东西,我假设与工作相关的东西..

制作一个简单的数组。名字。那些有50%额外获胜机会的人我会假设等于2比1.所以在这些名字中,我会在数组中做重复。

$lottoNames = array('bob', 'rob', 'rob', 'mike', 'john', 'todd', 'todd');
$x = count($lottoNames)-1;
$lotto = rand(0, $x);
echo $lottoNames[$lotto];

我不能说这会起作用,但是为了简单起见而再次运行它是一个耻辱的想法。

答案 5 :(得分:0)

这可能有效:

$chance = array(
    'bob' => 1,
    'rob' => 1.5,
    'mike' => 1,
    'john' => 1,
    'todd' => 1.5,
);

$range = array_sum($chance);
$offset = rand(0, $range-1);

$i = 0;
foreach ($chance as $person => $weight)
{
    $i += $weight;
    if ($i <= $offset)
    {
        echo $person . ' won';
        break;
    }
}