Javascript中的加权随机数生成器

时间:2013-12-14 18:14:59

标签: javascript

我使用以下代码生成随机数:

function getRandomInt (min, max) {
    return Math.floor((Math.random() * (max - min + 1)) + min;
}

我想要做的是添加一个有利于范围较低端数字的权重。

我想过可能会尝试将数字乘以1 /余弦。

这是否有效,是否有人知道我该怎么做?

非常感谢!

2 个答案:

答案 0 :(得分:11)

第一个解决方案

您需要一个包含点(0,0)和(1,1)的函数。例如:x^nn > 0

Math.pow(1, n) === 1

Math.pow(0, n) === 0

因此,您只需更改n,具体取决于您希望加权的工作方式。

  • 何时n = 1y === x
  • 何时n > 1y <= x
  • 何时0 < n < 1y >= x

因此,如果您希望较低的值比较高的值更受青睐,只需使用n > 1

var weighted = Math.pow(Math.random(), 2);

然后你可以像往常一样缩放结果。

var scaled = Math.floor(weighted * (max - min + 1)) + min;

y = x^2

其他功能

同样,您可以使用包含点(0,0),(1,1)的任何连续函数,并且范围和域为[0,1]。

正弦

y = sin(xπ/2)

余弦

y = 1 - cos(xπ/2)

答案 1 :(得分:1)

编辑:最终公式中有一个类型,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;

应该做的伎俩