2017-10-16 87 views
1

据我所知,随机整数能在JavaScript中产生这样的:非均匀(趋向值偏差)随机数在JavaScript

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

但我想要的是一组有偏见的随机数朝着特定的价值。

举个例子,如果我的具体的中心值是200,我想一组随机数的,有一个大的范围,但大多在200左右。但愿会有像

biasedRandom(center, biasedness)

+0

这听起来更像一个编程问题[数学](https://math.stackexchange.com)的问题。 – Quentin

+0

我希望也许会有这样做的内置方式。如果这是在数学论坛上,我不会得到。 – nipunasudha

+0

“主要”是什么意思?至少有50%的时间接近200?多近? – MinusFour

回答

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++){ 
 
\t 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>

+0

真棒男人!奇迹般有效。 – nipunasudha

+1

虽然Box-Muller真的很慢。如果这成为一个问题,你可能想谷歌“Ziggurat”当前最好的算法来生成高斯随机数,或者使用一些近似于钟形曲线的东西。 –

+0

谢谢@LeeDanielCrocker – nipunasudha