[英]Weighted Random Number Generator in Javascript
我使用以下代码生成一个随机数:
function getRandomInt (min, max) {
return Math.floor((Math.random() * (max - min + 1)) + min;
}
我想要做的是添加一个有利于范围下端数字的权重。
我想也许试图将数字乘以1 /余弦。
这会有效,有没有人知道我会怎么做?
非常感谢!
您需要一个包含点(0,0)和(1,1)的函数。 例如:当n > 0
时, x^n
Math.pow(1, n) === 1
和
Math.pow(0, n) === 0
因此,您只需根据加权工作的方式更改n
即可。
n = 1
: y === x
n > 1
: y <= x
0 < n < 1
: y >= x
因此,如果您希望较低的值优先于较高的值,则只需使用n > 1
。
var weighted = Math.pow(Math.random(), 2);
然后您可以像往常一样缩放结果。
var scaled = Math.floor(weighted * (max - min + 1)) + min;
同样,您可以使用包含点(0,0),(1,1)的任何连续函数,并且具有[0,1]的范围和域。
正弦
y = sin(xπ/2)
余弦
y = 1 - cos(xπ/2)
编辑:在最终公式中有一个类型,log(2 + log(x))是不正确的应该是log(1 + log(x))+ 1,它现在已经修复。
如果你使用对数加权,使用类似的东西
var x = Math.random();
var weighted = x * Math.log(1+x);
它会使0.5的重量在0.2左右,但1只能在0.69左右。
用这个
var x = Math.random();
var weighted = x * Math.log(2 + Math.log(x));
允许1在1的权重。所以结合它们,这
var x = Math.random();
var weighted = (x <= 0.5) ? x * Math.log(1 + x) : x * Math.log(1 + Math.log(x))+1;
应该做的伎俩
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.