按照两个值之间的分布对随机数进行采样

Sample a random number following a distribution between two values

我想在两个值之间创建一条高斯曲线(这是两个不同计算的终点)。我知道我需要更多的背景信息,但我想尝试一下结果。所以让我们假设什么是未知的,有问题的值可能是 1.9 和 2.1。

我的目标是在这两者之间随机抽取一个数字,作为下一次计算的起点,更偏向于均值而不是一个或另一个极端。

任何帮助将不胜感激,提前致谢!

更新一:

为清楚起见,

蓝线和黑线都是从某个原点开始的,计算不同,终点的值也不同。仅从这两个值,可以设置任意数量的点。 n 可以在 2 到 100 之间——没关系。关键是要创建一个如钟形曲线所示的分布。

根据 Severin Pappadeux 的出色建议,我们现在已经定义了 n,现在只剩下定义分布了。

n=10

IH=1.9:0.01:2.1
v = 1.9 + ((2.1-1.9)/n) * IH(n)

bar(IH)
hold on
bar(n,v,'k')

更新二: 结果!

如您所见,该曲线乘以两条曲线,每条曲线都有一个可能结果的分布,从中开始另一个计算。目的是接近设定点。我快完成了,所以

非常感谢!

可能会使用来自 https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution

的 Irwin-Hall

基本上,

min(IH(n)) = 0
max(IH(n)) = n
peak(IH(n)) = n/2

缩放到您的 [1.9...2.1] 范围

v = 1.9 + ((2.1-1.9)/n) * IH(n)

它是有界的,非常容易采样,而且总体上 n 它几乎是高斯分布的。您可以改变 n 以获得窄峰或宽峰

采样,在一些 C 伪代码中

double IH(int n) {
    double s = 0.0;
    for (int i = 0; i != n; ++i)
         s += uniform_random_number();

    return s;
}

更新

翻译成 Octave

function rv = IH(n)
  rv = 0.0;
  for i = 1:n
    x  = rand;
    rv = rv + x;
  end
endfunction

因此采样将沿线进行(例如,一百万个事件,IH 为 8 d.o.f)

n = 8
for k = 1:1000000
  v = 1.9 + ((2.1-1.9)/n) * IH(n);
  % process v
end

另一个更新,添加函数 QG,生成所需的随机向量

function [x] = QG (n, k)
  for i = 1:k
    x(i) = 1.9 + ((2.1-1.9)/n)*IH(n);
  end
endfunction

尝试沿着线

填充直方图
y = QG(8, 10000);
h = histogram(y);