按照两个值之间的分布对随机数进行采样
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);
我想在两个值之间创建一条高斯曲线(这是两个不同计算的终点)。我知道我需要更多的背景信息,但我想尝试一下结果。所以让我们假设什么是未知的,有问题的值可能是 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);