我使用以下代码生成随机数:
function getRandomInt (min, max) {
return Math.floor((Math.random() * (max - min + 1)) + min;
}
我想要做的是添加一个有利于范围较低端数字的权重。
我想过可能会尝试将数字乘以1 /余弦。
这是否有效,是否有人知道我该怎么做?
非常感谢!
答案 0 :(得分:11)
您需要一个包含点(0,0)和(1,1)的函数。例如:x^n
时n > 0
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)
答案 1 :(得分: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;
应该做的伎俩