代码之家  ›  专栏  ›  技术社区  ›  Advena Scimonster

以限制为重点获取随机数(抛物线曲线)

  •  2
  • Advena Scimonster  · 技术社区  · 6 年前

    我的数学知识可能仅限于自己解决这个问题。我发现了一个类似的 question 然而,重点放在中心而不是边界。

    我想用最大值和最小值创建随机数,但重点放在最大值和最小值上,因此接近最大值和最小值的数字应该比介于两者之间的数字出现得更频繁。

    我记得在数学中有一个函数可以创建抛物线曲线: enter image description here

    用这个 online tool 我生成了我想要的函数,应该是

    y=0.05*x^2

    这是我的基本想法,尝试将其转换为javascript,我最终得出以下结论:

    for (let i = 0; i < 100; i++) {
      // Create random x with ^ 2 with max=100 and min=0
      let x = Math.pow(Math.floor(Math.random() * (100 - 0 + 1)) + 0, 2);
      // log the random number in the console
      console.log(0.05 * x);
    }
    

    > 0 0
    > 0.05
    > 0.05
    > 0.2
    > 0.2
    > 0.8
    > 2.45
    > 3.2
    > 3.2
    > 3.2
    > 4.05
    > 4.05
    > 4.05
    > 6.05
    > 8.45
    > 8.45
    > 14.45
    > 16.2
    > 16.2
    > 16.2 20 20
    > 22.05
    > 22.05
    > 22.05
    > 26.45
    > 28.8
    > 28.8
    > 31.25
    > 33.8
    > 36.45
    > 39.2
    > 42.05
    > 48.05
    > 48.05
    > 48.05
    > 51.2
    > 57.8
    > 57.8
    > 57.8
    > 64.8
    > 64.8
    > 64.8
    > 68.45
    > 76.05
    > 88.2
    > 88.2
    > 92.45
    > 92.45
    > 92.45
    > 96.8
    > 101.25
    > 105.8
    > 110.45 125
    > 130.05
    > 130.05
    > 135.2
    > 140.45
    > 140.45
    > 145.8
    > 145.8
    > 145.8
    > 156.8
    > 162.45
    > 162.45
    > 162.45 180 180
    > 198.45
    > 204.8
    > 204.8
    > 224.45
    > 231.2
    > 231.2
    > 231.2
    > 231.2
    > 238.05
    > 238.05
    > 259.2 320 320
    > 328.05
    > 344.45
    > 352.8
    > 352.8
    > 361.25
    > 369.8
    > 387.2
    > 387.2
    > 423.2
    > 423.2
    > 432.45
    > 451.25
    > 460.8
    > 470.45
    > 470.45
    > 490.05
    > 490.05
    

    有人有主意吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   MBo    6 年前

    要生成具有所需分布的随机数,可以使用Smirnov变换( inverse sampling ).

    要得到抛物线分布,只需在0..1范围内使用均匀随机发生器并应用平方根。示例应生成0到100范围内的值,靠近端点的密度更大。

    for (let i = 0; i < 20; i++) {
      let x = Math.floor(50 * (Math.pow(Math.Random(), 0.5));
      if (Math.Random() < 0.5) 
          x = 50 - x
      else
          x = 50 + x;
       ...
    }
    
        2
  •  0
  •   Advena Scimonster    6 年前

    const max = 200;
    for (let i = 0; i < 20; i++) {
    
    const min = 40;
    const focus = 0.4; // 0 - 1, the lower the more focus on limitations
    
    let numbs = [];
    
    //The core function
    function randomFocusBorders(max, min) {
      const middle = (max - min) / 2;
      let x = Math.floor(50 * (Math.pow(Math.Random(), 0.5));
    
      let x = Math.floor(middle * Math.pow(Math.random(), focus));
      if (Math.Random() < 0.5) 
    
      if (Math.random() < 0.5) x = middle - x;
          x = 50 - x
    
      else x = middle + x;
      x += min;
      return x;
    
    }
      else
    
    
    
    //Call it 100 times and add value to numbs array
          x = 50 + x;
    
    for (let i = 0; i < 100; i++) {
      numbs.push(randomFocusBorders(max, min));
    
    }
    
    
    
    //Sort numbs array ascending
       ...
    
    numbs.sort((a, b) => {
      return a > b ? 1 : -1;
    }
    
    });
    
    
    console.log(numbs);
    

    工作 jsFiddle