我是一个网页游戏开发人员,我对随机数有一个问题。假设一个玩家有20%的机会用他的剑获得致命一击。这意味着,每5次点击中就有1次应该是关键的。问题是我在现实生活中得到了非常糟糕的结果--有时玩家在5次点击中得到3次crits,有时在15次点击中都没有。战斗相当短(3-10次命中),所以获得良好的随机分布是很重要的。
目前我使用PHP mt_rand(),但我们只是将我们的代码转移到C++,所以我想在我们游戏的新引擎中解决这个问题。
我不知道解决方案是不是某种均匀的随机生成器,或者可能是为了记住以前的随机状态来强制进行适当的分布。
发布于 2009-05-26 18:06:01
我同意前面的答案,即在一些游戏的小规模运行中真正的随机性是不可取的--对于一些用例来说,这似乎太不公平了。
我用Ruby编写了一个简单的Shuffle Bag类实现,并做了一些测试。该实现实现了以下功能:
如果它看起来仍然是公平的,或者我们还没有达到最小滚动次数的阈值,它会根据正常的probability.
基于边界概率,它被认为是不公平的。例如,对于20%的概率,您可以将10%设置为下限,将40%设置为上限。
使用这些界限,我发现在运行10次命中的情况下,真正的伪随机实现产生超出界限的结果的可能性为14.2%。大约11%的时间,在10次尝试中获得了0次关键命中。3.3%的时间,10次中有5次或更多的关键命中。自然,使用这个算法(最小滚动计数为5),更少的“公平”运行是越界的(0.03%)。即使下面的实现是不合适的(当然可以做更聪明的事情),值得注意的是,值得注意的是,您的用户经常会觉得使用真正的伪随机解决方案是不公平的。
这是我用Ruby语言编写的FairishBag的主要部分。整个实现和快速蒙特卡罗模拟is available here (gist)。
def fire!
hit = if @rolls >= @min_rolls && observed_probability > @unfair_high
false
elsif @rolls >= @min_rolls && observed_probability < @unfair_low
true
else
rand <= @probability
end
@hits += 1 if hit
@rolls += 1
return hit
end
def observed_probability
@hits.to_f / @rolls
end更新:使用此方法的确实增加了获得关键命中的总体概率,使用上面的界限约为22%。您可以通过将其“真实”概率设置得稍微低一点来抵消这一点。17.5%的概率与公平的修改产生了观察到的长期概率约为20%,并保持短期运行感觉公平。
发布于 2009-05-26 12:00:56
,也就是说,每5次点击中就有1次是关键的。问题是我在现实生活中得到了非常糟糕的结果--有时玩家在5次点击中得到3次crits,有时在15次点击中都没有。
您需要的是一个shuffle bag。它解决了真随机对游戏来说太随机的问题。
算法是这样的:你把1个关键的和4个非关键的命中放在一个包里。然后随机排列它们在包中的顺序,一次一个地挑选出来。当袋子为空时,您可以再次填充相同的值,并对其进行随机化。这样,平均每5次命中就有1次关键命中,最多连续2次关键命中和8次非关键命中。增加袋子中的物品数量以获得更多的随机性。
下面是我不久前编写的an implementation (用Java语言编写)和its test cases的一个示例。
发布于 2009-05-26 11:42:33
你对随机意味着什么有误解。
其中哪一个更具随机性?


虽然第二个图看起来更均匀分布,但实际上第一个图的随机性越强。人类的大脑经常看到随机的模式,所以我们将第一张图中的块状物视为模式,但它们不是-它们只是随机选择的样本的一部分。
https://stackoverflow.com/questions/910215
复制相似问题