彩票算法 – PHP – 数学似乎不错,但功能是否有效?

前端之家收集整理的这篇文章主要介绍了彩票算法 – PHP – 数学似乎不错,但功能是否有效?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想进行自定义彩票提取,以激励用户参与在线实验.规则是:

> 10%即可获得10美元
> 1%几率获得50美元
> 0.1%几率获得500美元

彩票是一个PHP函数,它被调用一次并返回奖品(0,10,50或500).我创建了下面的函数,经过70 000次试验后,统计数据是:

10美元> 9.11%
> .91%,50美元
> .01%,500美元

我应该担心这个算法吗?有没有比mt_rand更好的方法来创造良好的机会分配?

function lottery() {
  // winnings before extraction
  $win=0;

  // choose a winning number between 1 and 10
  $target=mt_rand(1,10);

  // make three independent extractions,each with 1/10 probability
  if (mt_rand(1,10) == $target) {
    // if first extraction is the winning number -> prize=10
    // probability: 1/10
    $win=10;

    if (mt_rand(1,10) == $target) {
        // if second extraction is ALSO the winning number -> prize=50
        // probability: 1/10 * 1/10
        $win=50;

        if (mt_rand(1,10) == $target) {
            // if third extraction is ALSO the winning number -> prize=500
            // probability: 1/10 * 1/10 * 1/10
            $win=500;
        }
    }
  }
  // return the prize
  return $win;
}

谢谢你帮助新手!

给定概率有四种结果:

赢得500美元的概率> 0.1%.
赢得500美元的概率> 1%.
赢得500美元的概率> 10%.

第四个结果 – 没有胜利 – 是100%减去其他三个结果的总和,即88.9%.

马克加布里尔已经解释了为什么你的初始代码已经关闭:通过推广10%赢得10到50美元赢家的人,你可以将他们从10美元的赢家中拿走,这将只占所有人的9%.

Pham Trung提供了一个解决方案,从目前为止的非赢家池中获取更高金额的赢家,并调整概率.这是一个可行的解决方案,但最简单的解决方案是我只能调用随机生成器一次.

这个解决方案也最好地反映了票证类比:你在一个盒子里放置了10,000张票. 1,000张门票从1到1000赢得10美元.从1001到1100的100张门票赢得50美元.从1101到1110的10张门票赢得500美元.从1111开始的所有8890门票都没有赢得任何东西:

function lottery() {
    var pick = Math.floor(10000 * Math.random());
               // random number in the range [0,10000).

    if (pick < 1000) return 10;
    if (pick < 1100) return 50;
    if (pick < 1110) return 500;

    return 0;
}

在此代码中,票证上只写有号码.你选一个.然后检查票号是否符合10美元的条件.如果没有,你检查同一张票是否可以下注50美元.实际上只涉及一个随机动作.

(我在Javascript中使用了基于零的随机函数而不是PHP的mt_rand,但我认为解决方案很明确.)

猜你在找的PHP相关文章