我想进行自定义彩票提取,以激励用户参与在线实验.规则是:
> 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美元.实际上只涉及一个随机动作.