【问题标题】:random function: higher values appear less often than lower随机函数:较高的值出现的频率低于较低的值
【发布时间】:2012-04-26 11:27:57
【问题描述】:

我有一个棘手的问题,我已经研究了几次但没有弄清楚。

一些背景故事:我正在制作一个基于文本的 RPG 游戏,玩家可以在其中与动物/怪物等进行战斗。它的工作方式与任何其他游戏一样,您每轮都会互相击中多个生命值。

问题:我正在使用 php 中的随机函数来生成命中的最终值,具体取决于等级、盔甲等。但我希望较高的值(如最大命中)出现的频率低于较低的值。

这是一个示例图:

如何使用 PHP 和 rand 函数重现类似的内容?输入rand(1,100) 时,每个数字都有相同的机会被选中。

我的想法是这样的:做一个二次函数(或二次函数)并使用随机数 (x) 进行计算。

这会如我所愿吗?

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

【问题讨论】:

  • 如果您希望较高的值出现的频率低于较低的值,那么图表应该颠倒不?我猜X轴是数字,Y轴是出现的机会。

标签: php math random


【解决方案1】:

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

有考虑掷骰子和结果百分比的交互式图表。 这对你应该很有用。

注意这种滚动随机数:

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

这应该可以满足您的需求。

【讨论】:

    【解决方案2】:

    好的,这是我的想法:

    假设您有一组元素(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)
    ...
    

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

    祝你好运! :-)

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 2021-06-30
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多