JavaScript中的随机数不均匀(偏向某个值)

时间:2017-10-16 14:25:03

标签: javascript random

我知道可以在JavaScript中生成随机整数,如下所示:

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

但我想要的是一组偏向特定值的随机数。

作为一个例子,如果我的特定中心值是200,我想要一组范围很大的随机数,但大多数是200左右。希望会有像

这样的函数

biasedRandom(center, biasedness)

1 个答案:

答案 0 :(得分:1)

听起来像高斯分布可能就在这里。

This stackoverflow post描述了如何制作高斯形状的东西。然后我们可以通过两个因素来扩展和转移分布;

  • 分布集中的平均值(在这种情况下为200)
  • 控制分布宽度的方差

我在我的示例中包含了生成数字的直方图(使用图表),因此您可以轻松地看到这两个参数vmean的变化如何影响生成的数字。在您的真实代码中,您不需要包含图表库。

// Standard Normal variate using Box-Muller transform.
function randn_bm() {
    var u = 0, v = 0;
    while(u === 0) u = Math.random(); //Converting [0,1) to (0,1)
    while(v === 0) v = Math.random();
    return Math.sqrt( -2.0 * Math.log( u ) ) * Math.cos( 2.0 * Math.PI * v );
}

//generate array
// number of points
let n = 50;
// variance factor
let v = 1;
// mean
let mean = 200;
let numbers = []
for (let i=0; i<n;i++){
	numbers.push(randn_bm())
}
// scale and shift
numbers = numbers.map( function (number){ return number*v + mean})

// THIS PURELY FOR PLOTTING
var trace = {
    x: numbers,
    type: 'histogram',
  };
var data = [trace];
Plotly.newPlot('myDiv', data);
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<div id="myDiv"></div>