为什么rand函数在大区间不均匀?

3次浏览(过去30天)
pankaj辛格
pankaj辛格 2016年6月23日
回答: pankaj辛格 2016年6月27日
我在用 rand函数 生成 均匀分布随机数 在区间[10e-6和1。但是函数生成的是no 接近1 (而不是在整个区间内一致)。我试过10个no .和100个no .,但我发现大多数生成的no .都接近1。那么,它怎么会是均匀分布呢??
3评论
约翰D 'Errico
约翰D 'Errico 2016年6月23日
Rand是统一的,它生成从0到1的范围内的数字。如果您在某种程度上滥用了rand的结果,那么就会出现奇怪的结果。所以展示一下你写了什么。

登录评论。

接受的答案

约翰D 'Errico
约翰D 'Errico 2016年6月26日
编辑:约翰D 'Errico 2016年6月26日
叹息。我认为这是对统一随机的误解。这也是一个相当常见的问题。由于您似乎对展示您的代码不感兴趣,因此只能猜测问题所在。如果我没有看到您的代码,就无法确定答案。(补充:OP后来添加了一条评论,表明我的猜想完全正确。)
您将生成具有目标间隔[1e-6,1]的统一随机数字。
均匀分布意味着对于全局窗口[1]中包含的任何固定宽度的子区间。e-6,1](假设有一个子区间[a,b]
1e-6 <= a <= b <=1
那么我们将观测到的事件的预期数量应该是:
(b - a)/(1 - 1e-6)
如果生成N个样本,则子区间内事件的期望数量为:
N*(b - a)/(1 - 1e-6)
因此,预计会看到许多与子间隔宽度成比例的事件。你不会看到那么多,因为这是一个随机抽样。
因此,在区间[0,1]上进行均匀随机抽样时,每个箱子[0,0.1]、[0.1,0.2]、[0.2,0.3]中大约有10%的样本,等等。
在你的例子中,你在区间[1e-6,1]上进行抽样。你会发现很少有样本出现在最底端,比如在[1e-6,1e-5]之间。
让我们使用上面的规则来看看在这个区间内应该出现多少样本。假设我们在整个区间内生成1000个值的样本容量。对我来说挺大的。
1000*(1e-5 - 1e-6)/(1 - 1e-6)
ans =
0.009
嗯。我只希望在这个子区间内看到0.009个样本,而我本希望看到
1000*(1 - 0.9)/(1 - 1e-6)
ans =
One hundred.
在子区间[0.9,1]中有100个事件。
这真的是均匀抽样吗?是的! !当然是!你需要明白我展示的第一个区间是一个非常小的区间。
如果你要求生成一个在该区域内均匀概率的抽样,但你真正想要的是某种在对数空间内均匀的抽样,那么你需要使用一个适当的随机抽样方案!
例如,试试这个:
R = 10.^(rand(1,1000)*6 - 6);
看看这个抽样方案的一些百分位数:
最小值1.005 e-06
1.0% 1.144 e-06
5.0% 2.036 e-06
10.0% 4.529 e-06
25.0% 4.117 e-05
50.0% 0.001265
75.0% 0.03185
90.0% 0.2554
95.0% 0.5309
99.0% 0.8607
马克斯0.9928
它不是均匀的,至少不是在定义域[1e-6,1]。但是这些数的log10是均匀分布的。因此,我们期望log10的大约50%的值小于-3。
最小值-5.998
1.0% -5.941
5.0% -5.691
10.0% -5.344
25.0% -4.385
50.0% -2.898
75.0% -1.497
90.0% -0.5928
95.0% -0.275
99.0% -0.06513
马克斯-0.003133
同样,它不会是完美的。但1000人的样本量并不算大。这些预测只有在N增长到一个非常大的数字时才成立。
同样,这只是一个大胆的猜测。
3评论
约翰D 'Errico
约翰D 'Errico 2016年6月26日
编辑:约翰D 'Errico 2016年6月26日
你看了我的回复了吗?如果不能,为什么不能?我花了大概一个小时给你写回信。那你问的问题和我刚才回答的一模一样。
阅读我的答案。在那个回答中,我解释了为什么你会感到困惑,为什么你没有得到你想要看到的那种抽样。然后,我将展示如何实现所需的抽样。但如果你问了一个问题,却懒得去阅读答案,也不去思考答案说了什么,我怎么能做得更多呢?(如果我看起来很沮丧,我很抱歉。)

登录评论。

更多答案(2)

罗杰·斯塔福德
罗杰·斯塔福德 2016年6月26日
编辑:罗杰·斯塔福德 2016年6月26日
从Pankaj最近的评论中可以清楚地看出,Pankaj所说的“均匀”实际上是指一个“对数”分布,其中在[10^(-6),10^(-5)]区间内的样本数量与在[10^(-1),10^(-k+1)]区间内的样本数量相同,而且在任何区间内[10^(-k),10^(-k+1)], -6<=k<=-1。如果是这样的话,正确的代码应该是:
R = 10.^(-6*rand(1,n));
1评论
罗杰·斯塔福德
罗杰·斯塔福德 2016年6月26日
哦!我没有注意到约翰之前给出的同样的答案。

登录评论。


pankaj辛格
pankaj辛格 2016年6月27日
亲爱的所有,
感谢您的回复和时间……我认为使用 “对数” 分发版可能更适合在我的应用程序中使用,而不是 “统一” 分布。

标签

下载188bet金宝搏

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!