我想知道是否有算法生成随机数,这些随机数很可能在从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
我查看了维基百科上的一些发行版,但我不太了解它们,知道如何控制最小和最大输出等.
任何帮助都非常受欢迎
生成具有给定分布的随机数的简单方法是从列表中选择随机数,其中应该更频繁地出现的数字根据期望的分布重复.
例如,如果您创建一个列表[1,1,1,2,2,2,3,3,3,4]并从中选择一个随机索引0来9从该列表中选择一个元素,您将得到一个<4概率为90%的数字.
或者,使用上述从实施例的分布,产生一个阵列[2,5,8,9],并从随机挑选一个整数0来9,如果是 ?2(这将与30%的概率发生),则返回1,如果是>2和?5返回(这也将与30%的概率发生)2等
在此解释:https://softwareengineering.stackexchange.com/a/150618
概率分布函数只是一个函数,当您输入值 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 到 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。
优点
缺点