JavaScript中偏向某个值的非均匀随机数

3

我知道在JavaScript中可以像这样生成随机整数:

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

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

例如,如果我的特定中心值为200,我希望得到一组具有很大范围但大部分在200左右的随机数。希望有一个函数可以实现:

biasedRandom(center, biasedness)


这更像是一个数学问题而不是编程问题。 - Quentin
我希望也许有一种内置的方法来做这件事。如果这是在数学论坛上,我就得不到那个了。 - nipunasudha
“mostly”是什么意思?至少50%的时间这些数字接近200?那么“接近”指的是多接近? - MinusFour
@MinusFour 希望有一个这样的函数 biasedRandom(center, biasedness) 吗? - nipunasudha
这是一个重复的问题,虽然可能有很多其他方法来解决这个问题,而不仅仅是接受的答案:https://dev59.com/Jl0b5IYBdhLWcg3wUP4X - Nick
1个回答

3
这里似乎需要一个高斯分布。 这篇 stackoverflow帖子 描述了如何生成高斯形状的内容。我们可以通过两个因素来缩放和移动分布:
  • 均值(在此示例中为200),即分布的中心
  • 方差,它控制分布的宽度
我在示例中包含了生成数字的直方图(使用plotly),以便您可以轻松地看到如何改变这两个参数vmean会影响生成的数字。在您的实际代码中,您不需要包含plotly库。

// 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>


2
虽然Box-Muller算法真的很慢。如果这成为问题,你可能想要谷歌搜索“Ziggurat”以获取当前生成高斯随机数的最佳算法,或者使用一些近似钟形曲线的方法。 - Lee Daniel Crocker
感谢@LeeDanielCrocker。 - nipunasudha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接