随机函数:较高的值出现的频率低于较低的值

时间:2012-04-26 11:27:58

标签: php math random

我有一个棘手的问题,我已经好好看了几次而没有搞清楚。

一些背景故事:我正在制作一个基于文本的角色扮演游戏,玩家可以与动物/怪物等进行战斗。它的效果就像其他任何游戏中你每一轮都会碰到许多生命值。

问题:我在php中使用随机函数来生成命中的最终值,具体取决于等级,护甲等。但是我希望较高的值(比如最大命中)看起来要低于较低值。

这是一个示例图:

Example graph

如何使用PHP和rand函数重现这样的东西?输入rand(1,100)时,每个号码都有相同的被选机率。

我的想法是:制作第二度(或二次函数)并使用随机数(x)进行计算。

这会像我想的那样工作吗?

这个问题有点棘手,如果你想了解更多信息和细节,请告诉我。

2 个答案:

答案 0 :(得分:1)

请看这篇美丽的文章: http://www.redblobgames.com/articles/probability/damage-rolls.html

有交互式图表,考虑骰子滚动和结果百分比。 这应该对你非常有用。

注意这种滚动随机数:

roll1 = rollDice(2,  12);
roll2 = rollDice(2,  12);
damage = min(roll1, roll2);

这可以为您提供所需的信息。

答案 1 :(得分:0)

好的,这是我的想法:

假设您有一系列元素(a,b,c,d)并且您不会随机选择其中一个元素。使用rand(1,4)获取随机元素索引意味着所有元素都有相同的出现机会。 (25%)

现在,我们假设我们采用这个数组:(a,b,c,d,d)

在这里,我们仍然有4个元素,但并非每个元素都有相同的机会出现。

  
      
  • a,b,c:20%
  •   
  • d:40%
  •   

或者,我们来看看这个数组:

(1,2,3,...,97,97,97,98,98,98,99,99,99,100,100,100,100)

提示:这样您不仅会偏向随机数生成算法,而且实际上会设置每个(或一系列数字)的显示概率)。


所以,我就是这样做的:

如果你想要1到100之间的数字(更频繁地出现更高的数字,请从1到1000获得一个随机数,并将其与更宽的范围联系起来。例如。

rand = 800-1000 => rand/10 (80->100)
rand = 600-800  => rand/9 (66->88)
...

或类似的东西。 (您可以使用您想象的任何数学运算,模数或其他...并使用您的算法)。我希望你明白我的想法。

祝你好运! : - )