我正在制作一个彩票脚本,从5个用户的列表中选择一个随机的。我的问题是,有些用户必须有50%的获胜机会。
例如
bob - 1 chance
rob - 1.5 chance
mike - 1 chance
john - 1 chance
todd - 1.5 chance
我怎样才能做到这一点?我正在考虑构建一个数组并使用array_rand
来获得一个随机用户,但我不知道如何分配机会。
由于
答案 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;
}
}