首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何生成偏向某一范围内某一值的随机数?

如何生成偏向某一范围内某一值的随机数?
EN

Stack Overflow用户
提问于 2015-03-29 10:43:38
回答 3查看 6.1K关注 0票数 27

比方说,如果我想在minmax之间生成一个无偏的随机数,我会这样做:

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

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

EN

回答 3

Stack Overflow用户

发布于 2015-03-31 00:32:54

乐趣:使用图像作为密度函数。对随机像素进行采样,直到得到黑色像素,然后取x坐标。

代码:

getPixels = require("get-pixels"); // npm install get-pixels

getPixels("distribution.png", function(err, pixels) {
  var height, r, s, width, x, y;
  if (err) {
    return;
  }
  width = pixels.shape[0];
  height = pixels.shape[1];
  while (pixels.get(x, y, 0) !== 0) {
    r = Math.random();
    s = Math.random();
    x = Math.floor(r * width);
    y = Math.floor(s * height);
  }
  return console.log(r);
});

输出示例:

0.7892316638026386
0.8595335511490703
0.5459279934875667
0.9044852438382804
0.35129814594984055
0.5352215224411339
0.8271261665504426
0.4871773284394294
0.8202084102667868
0.39301465335302055

根据口味进行缩放。

票数 6
EN

Stack Overflow用户

发布于 2015-03-30 01:50:47

为了好玩,这里有一个依赖于Gaussian function的版本,正如SpiderPig对您的问题的评论中所提到的那样。高斯函数应用于1到100之间的随机数,其中钟形的高度表示最终值与N的接近程度。我将度数D解释为最终值接近N的可能性有多大,因此D对应于钟形的宽度- D越小,偏差越小。显然,这个例子可以进一步校准。

(我复制了Ken Fyrstenberg的canvas方法来演示该功能。)

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);
})();
<canvas width=600></canvas>

票数 5
EN

Stack Overflow用户

发布于 2015-03-29 11:27:23

比方说,当你使用Math.floor(Math.random() * (max - min + 1)) + min;时,你实际上是在创建一个均匀的分布。要获得图表中的数据分布,您需要的是具有非零偏度的分布。

有不同的技术可以获得这些类型的分布。这是在stackoverflow上找到的测试版的example

以下是链接中总结的示例:

unif = Math.random()  // The original uniform distribution.

我们可以通过以下方式将其转换为beta发行版

beta = sin(unif*pi/2)^2 // The standard beta distribution

为了得到图表中显示的偏斜度,

beta_right = (beta > 0.5) ? 2*beta-1 : 2*(1-beta)-1;

您可以将值1更改为任何其他值,以使其倾斜为其他值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29325069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档