How to generate random numbers biased towards one value in a range?

后端 未结 4 1933
独厮守ぢ
独厮守ぢ 2020-12-08 01:08

Say, if I wanted to generate an unbiased random number between min and max, I\'d do:

var rand = function(min, max) {
    return Mat         


        
4条回答
  •  鱼传尺愫
    2020-12-08 01:33

    Just for fun, here's a version that relies on the Gaussian function, as mentioned in SpiderPig's comment to your question. The Gaussian function is applied to a random number between 1 and 100, where the height of the bell indicates how close the final value will be to N. I interpreted the degree D to mean how likely the final value is to be close to N, and so D corresponds to the width of the bell - the smaller D is, the less likely is the bias. Clearly, the example could be further calibrated.

    (I copied Ken Fyrstenberg's canvas method to demonstrate the function.)

    function randBias(min, max, N, D) {
      var a = 1,
          b = 50,
          c = D;
    
      var influence = Math.floor(Math.random() * (101)),
        x = Math.floor(Math.random() * (max - min + 1)) + min;
    
      return x > N 
             ? x + Math.floor(gauss(influence) * (N - x)) 
             : x - Math.floor(gauss(influence) * (x - N));
    
      function gauss(x) {
        return a * Math.exp(-(x - b) * (x - b) / (2 * c * c));
      }
    }
    
    var ctx = document.querySelector("canvas").getContext("2d");
    ctx.fillStyle = "red";
    ctx.fillRect(399, 0, 2, 110);
    ctx.fillStyle = "rgba(0,0,0,0.07)";
    
    (function loop() {
      for (var i = 0; i < 5; i++) {
        ctx.fillRect(randBias(0, 600, 400, 50), 4, 2, 50);
        ctx.fillRect(randBias(0, 600, 400, 10), 55, 2, 50);
        ctx.fillRect(Math.random() * 600, 115, 2, 35);
      }
      requestAnimationFrame(loop);
    })();

提交回复
热议问题