我正在开发一款类似游戏的小应用程序,之前我已经完成了这项工作,但仍然不确定这是否是正确的方法。我需要的是某些事件的百分位数,例如在赢得10%的机会后获得一个项目。
我每次都在服务器端使用随机数生成器,如果数字<= 10则用户将获得奖励,但它仍然不能满足所有用户环境中的10%标准。
我正在考虑在服务器端记录用户的转弯号码并且每第n次奖励一个项目,但不知道这是否正确。我想知道你这样做的想法和建议。另外我不知道stackoverflow是否适合发布这个或任何其他的stackexchange组社区。如果是这样,请引导我发表评论,我会在适当的社区提出问题。感谢。
答案 0 :(得分:4)
你在问题中提到了两件完全不同的事情。你必须决定你想要哪个,因为给定的算法不能同时做到这两点。
每次尝试,都有10%的几率。您可能会看到它连续打了两次然后它可能没有达到200次尝试。但是,从长远来看,它会有10%的时间。
您保证每10次尝试中,它只会打一次,不会更多,永远不会更少。
上面的第一个很好,有一个适当的随机数选择和比较。但是,你会得到比预期更多的点击数和更少的点击数。随着时间的推移,平均点击次数将是你的10%。
function getRandomTenPercentOutcome() {
return Math.random() < 0.1;
}
第二个需要更复杂的实现,它结合了随机生成器和跟踪最近事件。实现有保证的1/10命中的最简单方法是让服务器创建一个填充零,然后随机选择数组中的一个单元格并将其更改为1。
然后,当您需要选择随机结果时,您.shift()
关闭数组中的第一项并使用该值。当数组变空时,您将创建一个新数组。这迫使十分之一的结果(从头开始)到达。当你越过创建一个新数组的边界时,任何给定的10个结果可能有2或0,但是不可能比这更远。
您可以使阵列在系统范围内(所有用户都有一个阵列)或每个用户(每个用户都有自己的结果数组)。如果您希望每个用户个人认为它非常接近十分之一,那么您需要为每个用户创建一个单独的结果数组。
可以调整数组的长度以控制您想要允许的方差。例如,您可以创建一个长50的数组,并随机选择数组中的5个单元格。这将允许在50内更多的变化,但仍然会在50内点击5次。
从长远来看,这两种方法平均为10%。第一个在任何给定的间隔内可能有10%的偏差,但随机性会更大。第二个偏差小于10%,但有些人会说它随机性较小(这不一定是坏的 - 取决于你的目标)。两者都是&#34;公平&#34;。
我从儿子的游戏中知道他认为事情是不公平的&#34;当一连串不太可能发生的事情发生时,即使连续性在一系列随机事件的偶然预期结果中也是如此。因此,有时候真正随意的对参与者来说可能看起来不公平,因为偶尔会出现偶然的零星性质。
答案 1 :(得分:3)
在其他stackoverflow页面中似乎已经要求这些问题用于多种语言。
例如,这里是Java:Java: do something x percent of the time
查看链接以获取一些想法,但请记住,在最终获得大量样本的情况下,它将倾向于10%的时间,您只能在几次通话时立即预期10%。
我同意每隔一段时间奖励一件物品是不可能的。