我使用以下函数在特定范围内生成随机双精度:
nextDouble(1.50, 7.00)
然而,我一直在try 提出一种算法,使随机化具有更高的概率来生成接近1.50而不是7.00的双精度.但我甚至不知道它从哪里开始.有什么事吗?
Java也很受欢迎.
我使用以下函数在特定范围内生成随机双精度:
nextDouble(1.50, 7.00)
然而,我一直在try 提出一种算法,使随机化具有更高的概率来生成接近1.50而不是7.00的双精度.但我甚至不知道它从哪里开始.有什么事吗?
Java也很受欢迎.
我建议不要从生成概率不规则的随机数的Angular 来考虑这个问题.相反,考虑通常在某个范围内生成一个随机数,然后以非线性方式将该范围映射到另一个范围.
让我们将算法分为3个步骤:
[0, 1)
范围内的随机数(因此使用标准随机生成器).[0, 1)
范围.[0, 1)
线性映射为[1.5, 7)
.步骤1.和3.都很简单,我们算法的核心是2.我们需要一种将[0, 1)
映射到另一个[0, 1)
的方法,但这是非线性的,因此,例如0.7
不必生成0.7
.classic 数学在这里很有帮助,我们只需要看看代数函数的可视化表示.
在您的例子中,您希望当输入数从0增加到1时,结果首先增长非常缓慢(在更长的时间内保持在1.5
附近),但随后会加快.例如,y = x ^ 2
函数就是这样的.生成的代码可能类似于:
fun generateDouble(): Double {
val step1 = Random.nextDouble()
val step2 = step1.pow(2.0)
val step3 = step2 * 5.5 + 1.5
return step3
}
or just:
fun generateDouble() = Random.nextDouble().pow(2.0) * 5.5 + 1.5
通过将指数更改为更大的数字,曲线将更具侵略性,因此它将更倾向于1.5
.通过使指数接近1
(例如1.4
),结果将更接近线性,但仍然有利于1.5
.使指数小于1将开始有利于7
.
您还可以查看具有此形状的其他代数函数,例如y = 2 ^ x - 1
.