繁体   English   中英

Javascript中的加权随机数生成器

[英]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 = 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)

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM