1

我有一个类似抽奖的程序:用户在一个项目上放置了 x 个令牌。这将作为 user_id、item_id、number_of_tokens 记录到数据库中

到了画画的时候,我会做以下事情:

$ballots = array();
$users = all users that placed at least one token on Item A.

foreach( $users as $user )
{
  $number_of_ballots = Get number of ballots this User placed on Item A
  for($i = 1; $i leq $number_of_ballots; $i++)
  {
    $ballots[] = $user->id;
  }
}
shuffle( $ballots );
$winner_user_id = mt_rand(0, count($ballots) -1 );

现在我的问题是:

  • 这能保证随机选择吗?
  • 将 10 个代币放在物品 A 上的人获胜的机会是否比将 1 个代币放在物品 A 上的人高 10 倍?

谢谢你的帮助。

4

2 回答 2

1

是的,在伪随机数生成器的范围内。mt_rand优于rand,但仍然不是真正随机的。答案真的是“足够接近”。请注意,由于您是从组中随机挑选获胜者,因此您实际上并不需要shuffle.

是的,拥有 10 个代币的人比拥有 1 个代币的人的机会高 10 倍。

于 2012-09-24T23:23:09.023 回答
1

对我来说看起来不错,但是mt_rand,虽然比 rand 好,但并不完美。最好使用真正的随机数生成器,例如http://www.random.org/这是他们的一个小比较

此外,如果您处理的是真钱,random.org 会提供真实性证书来验证您选择的随机性。

于 2012-09-24T23:25:00.057 回答