温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - How to generate random numbers biased towards one value in a range?
algorithm javascript math probability

javascript - 如何生成偏向某个值的随机数?

发布于 2020-03-28 23:31:32

假设,如果我想在min之间生成一个无偏随机数max,我会这样做:

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

但是,如果我想生成一个介于之间的随机数minmax而又偏向Nmin之间的某个值max,该D怎么办?最好用概率曲线来说明:

在此处输入图片说明

查看更多

查看更多

提问者
c00000fd
被浏览
157
user1693593 2015-03-29 18:33

这是一种方法:

  • 获取最小-最大范围内的随机数
  • 获取随机归一化混合值
  • 基于随机混合的偏向随机混合

即,以伪:

变量:
  最小值= 0
  最大= 100
  偏差= 67(N)
  影响力= 1(D)[0.0,1.0]

式:
  rnd = random()x(最大-最小)+最小
  混合= random()x影响
   = rnd x(1-混合)+偏差x混合

可以使用辅助因子来降低混合因子,以设置其应影响的程度(即mix * factor,因子为[0,1])。

演示版

这将绘制有偏的随机范围。上限带为1,下限为0.75。偏置在此设置为范围的2/3。底带没有(故意)偏差进行比较。

var ctx = document.querySelector("canvas").getContext("2d");
ctx.fillStyle = "red"; ctx.fillRect(399,0,2,110);  // draw bias target
ctx.fillStyle = "rgba(0,0,0,0.07)";

function getRndBias(min, max, bias, influence) {
    var rnd = Math.random() * (max - min) + min,   // random in range
        mix = Math.random() * influence;           // random mixer
    return rnd * (1 - mix) + bias * mix;           // mix full range and bias
}

// plot biased result
(function loop() {
  for(var i = 0; i < 5; i++) {  // just sub-frames (speedier plot)
    ctx.fillRect( getRndBias(0, 600, 400, 1.00),  4, 2, 50);
    ctx.fillRect( getRndBias(0, 600, 400, 0.75), 55, 2, 50);
    ctx.fillRect( Math.random() * 600          ,115, 2, 35);
  }
  requestAnimationFrame(loop);
})();
<canvas width=600></canvas>