彩票算法 – PHP – 数学似乎不错,但功能是否有效?
我想进行自定义彩票提取,以激励用户参与在线实验.规则是:
> 10%即可获得10美元 彩票是一个PHP函数,它被调用一次并返回奖品(0,10,50或500).我创建了下面的函数,经过70 000次试验后,统计数据是: 10美元> 9.11% 我应该担心这个算法吗?有没有比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%. 第四个结果 – 没有胜利 – 是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,但我认为解决方案很明确.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |