2017-10-16 3 views
1

Je suis conscient que les entiers aléatoires peuvent être générés en JavaScript comme ceci:non uniforme (biaisé vers une valeur) des nombres aléatoires en JavaScript

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

Mais ce que je veux est un ensemble de nombres aléatoires qui sont biaisées vers une valeur spécifique.

À titre d'exemple, si ma valeur centrale spécifique est de 200, je veux un ensemble de nombres aléatoires qui a une large gamme, mais la plupart du temps autour de 200. Il faut espérer qu'il y aura une fonction comme

biasedRandom(center, biasedness)

+0

Cela ressemble plus à un problème que d'un problème de programmation [mathématiques] (https://math.stackexchange.com). – Quentin

+0

J'espérais peut-être qu'il y aurait une façon de le faire. Je ne comprendrai pas si c'était sur le forum de mathématiques. – nipunasudha

+0

Que voulez-vous dire par "surtout"? Au moins 50% du temps, ils sont proches de 200? Et à quelle distance est proche? – MinusFour

Répondre

1

Cela ressemble à une distribution gaussienne pourrait être à peu près ici.

This stackoverflow post décrit comment produire quelque chose de forme gaussienne. Nous pouvons ensuite redimensionner et déplacer la distribution par deux facteurs;

  • Le moyen (200 dans ce cas) qui est l'endroit où la distribution est centrée
  • La variance qui permet de contrôler la largeur de la distribution

nous avons inclus un histogramme des nombres générés (en utilisant l'intrigue) dans mon exemple afin que vous puissiez facilement voir comment faire varier ces deux paramètres v et mean affecte les nombres générés. Dans votre code réel, vous n'avez pas besoin d'inclure la bibliothèque de l'intrigue.

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

homme génial! fonctionne comme un charme. – nipunasudha

+1

Bien que Box-Muller est vraiment lent. Si cela devient un problème, vous pourriez vouloir google "Ziggurat" pour le meilleur algorithme actuel pour générer des aléas gaussiens, ou utiliser quelque chose qui se rapproche juste d'une courbe en cloche. –

+0

Merci @LeeDanielCrocker – nipunasudha