2017-10-16 89 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