为RPG游戏生成随机数

chr*_*hrs 5 random algorithm

我想知道是否有算法生成随机数,这些随机数很可能在从min到max的范围内很低.例如,如果你生成一个介于1和100之间的随机数,那么如果你用这个函数f(min: 1, max: 100, avg: 30)调用它,f(min: 1, max: 200, avg: 10)大部分时间都应该低于30 ,但是如果你调用它的最多,那么平均值应该是10.很多游戏都会这样做,但是我根本找不到用公式做这个的方法.我见过的大多数例子都使用了"drop table"或类似的东西.

我已经提出了一种相当简单的方法来衡量一个滚动的结果,但它不是很有效,你没有很多控制它

var pseudoRand = function(min, max, n) {
    if (n > 0) {
        return pseudoRand(min, Math.random() * (max - min) + min, n - 1)
    }

    return max;
}

rands = []
for (var i = 0; i < 20000; i++) {
    rands.push(pseudoRand(0, 100, 1))
}

avg = rands.reduce(function(x, y) { return x + y } ) / rands.length
console.log(avg); // ~50
Run Code Online (Sandbox Code Playgroud)

该函数只需在最小和最大N次之间选取一个随机数,其中每次迭代都会在最后一次滚动时更新最大值.因此,如果你用N = 2, and max = 100它调用它,它必须连续两次滚动100才能返回100

我查看了维基百科上的一些发行版,但我不太了解它们,知道如何控制最小和最大输出等.

任何帮助都非常受欢迎

use*_*737 8

生成具有给定分布的随机数的简单方法是从列表中选择随机数,其中应该更频繁地出现的数字根据期望的分布重复.

例如,如果您创建一个列表[1,1,1,2,2,2,3,3,3,4]并从中选择一个随机索引09从该列表中选择一个元素,您将得到一个<4概率为90%的数字.

或者,使用上述从实施例的分布,产生一个阵列[2,5,8,9],并从随机挑选一个整数09,如果是 ?2(这将与30%的概率发生),则返回1,如果是>2?5返回(这也将与30%的概率发生)2

在此解释:https://softwareengineering.stackexchange.com/a/150618


Alg*_*msX 4

概率分布函数只是一个函数,当您输入值 X 时,将返回获得该值 X 的概率。累积分布函数是获得小于或等于 X 的数字的概率。CDF 是PDF 的积分。CDF 几乎总是一对一函数,因此它几乎总是有一个逆函数。

要生成 PDF,请将值绘制在 x 轴上,将概率绘制在 y 轴上。所有概率的总和(离散)或积分(连续)应等于 1。找到一些可以正确模拟该方程的函数。为此,您可能需要查找一些 PDF。

基本算法

https://en.wikipedia.org/wiki/Inverse_transform_sampling

该算法基于逆变换采样。ITS 背后的想法是,您在 CDF 的 y 轴上随机选取一个值,并找到它对应的 x 值。这是有道理的,因为随机选择一个值的可能性越大,它在 CDF 的 y 轴上占用的“空间”就越大。

  1. 提出一些概率分布公式。例如,如果您希望随着数字变高,选择它们的几率也会增加,您可以使用 f(x)=x 或 f(x)=x^2 之类的值。如果你想要中间凸出的东西,你可以使用高斯分布或 1/(1+x^2)。如果您想要有界公式,可以使用 Beta 分布或 Kumaraswamy 分布。
  2. 对 PDF 进行积分即可得到累积分布函数。
  3. 求 CDF 的倒数。
  4. 生成一个随机数并将其插入到 CDF 的逆中。
  5. 将该结果乘以(最大-最小值),然后加上最小值
  6. 将结果四舍五入到最接近的整数。

步骤 1 到 3 是您必须硬编码到游戏中的内容。对于任何 PDF 来说,解决这个问题的唯一方法是求解与其平均值相对应的形状参数,并遵守您想要的形状参数的约束。如果您想使用 Kumaraswamy 分布,您需要将其设置为形状参数 a 和 b 始终大于 1。

我建议使用 Kumaraswamy 分布,因为它是有界的,并且具有非常好的封闭形式和封闭形式逆。它只有两个参数,a 和 b,而且非常灵活,因为它可以对许多不同的场景进行建模,包括多项式行为、钟形曲线行为以及两侧都有峰值的盆地行为。此外,使用此功能进行建模并不难。形状参数b越高,则越向左倾斜,形状参数a越高,则越向右倾斜。如果 a 和 b 都小于 1,则分布看起来像槽或盆地。如果 a 或 b 等于 1,则分布将是一个凹性从 0 到 1 不改变的多项式。如果 a 和 b 都等于 1,则分布是一条直线。如果 a 和 b 大于 1,则该函数将看起来像钟形曲线。要了解这一点,您可以做的最好的事情就是实际绘制这些函数的图表或仅运行逆变换采样算法。

https://en.wikipedia.org/wiki/Kumaraswamy_distribution

例如,如果我想要一个形状像这样的概率分布,其中 a=2 和 b=5 从 0 到 100:

https://www.wolframalpha.com/input/?i=2*5*x%5E(2-1)*(1-x%5E2)%5E(5-1)+from+x%3D0+to +x%3D1

其 CDF 为:

CDF(x)=1-(1-x^2)^5

它的倒数是:

CDF^-1(x)=(1-(1-x)^(1/5))^(1/2)

Kumaraswamy 分布的一般逆为: CDF^-1(x)=(1-(1-x)^(1/b))^(1/a)

然后我会生成一个从 0 到 1 的数字,将其放入 CDF^-1(x) 中,并将结果乘以 100。

优点

  • 非常精准
  • 连续的,而不是离散的
  • 使用一种公式且占用空间极小
  • 让您可以很好地控制随机性的分布方式
  • 许多这些公式都具有带有某种逆的 CDF
  • 有一些方法可以绑定两端的函数。例如,Kumaraswamy 分布的范围是 0 到 1,因此您只需输入 0 到 1 之间的浮点数,然后将结果乘以 (max-min) 并加上 min。根据您传递给它的值,Beta 分布的界限有所不同。对于像 PDF(x)=x 这样的东西,CDF(x)=(x^2)/2,因此您可以生成从 CDF(0) 到 CDF(max-min) 的随机值。

缺点

  • 您需要想出您计划使用的确切分布及其形状
  • 您计划使用的每个通用公式都需要硬编码到游戏中。换句话说,您可以将一般的 Kumaraswamy 分布编程到游戏中,并拥有一个根据分布及其参数 a 和 b 生成随机数的函数,但不能有一个根据平均值生成分布的函数。如果您想使用分布 x,您必须找出 a 和 b 的哪些值最适合您想要查看的数据,并将这些值硬编码到游戏中。