在两个值之间分配后对随机数进行采样

时间:2015-06-12 22:27:03

标签: matlab random distribution gaussian sampling

我想在两个值之间创建一条高斯曲线(这是两个不同计算的终点)。我知道我需要更多的背景信息,但我想玩结果。因此,让我们假设未知的,所讨论的值可能是1.9和2.1。 enter image description here

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

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

更新I:

为了清楚起见,

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

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

enter image description here

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')

更新II:结果<!/强>

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

非常感谢!

enter image description here

1 个答案:

答案 0 :(得分:1)

可以使用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);