我正在MATLAB中使用randn
来生成给定均值和标准差的一组随机数。
b=5000;
a=500;
y = a.*randn(100,1) + b;
sprintf('%f\n',y)
我希望生成的数字在4500到5500之间。但是,我看到的值在3000到6000之间。
有人可以解释为什么会这样吗?
或者是否有任何方法可以指定这些值应该在平均值正负1 SD之间?
答案 0 :(得分:0)
值不位于间隔[4500,5500]
中的原因是,从randn()
出来的数字不限于间隔[-1,1]
,这就是为什么您的方法不即使一般方法可行,您仍可以按预期工作。来自randn
的数字来自标准正态分布,其标准偏差为1,平均值为零。从理论上讲,-inf
和+inf
之间的任何值都可以超出randn。
您可以执行以下两项操作之一,具体取决于您要执行的操作以及如何限制您的选择:
选项1 是生成您的随机数并除以最大绝对值,然后再执行其他操作,即:
z = randn(100,1);
z = z / max(abs(z));
y = 5000 + 500*z;
这将确保z
不包含小于-1或大于+1的任何值(请注意,它确实确保其中至少有一个(-1或+1)存在)数组z
)。然后,您可以使用b
和a
的值在您选择的间隔内将值转换为随机数。
编辑:请注意(如该答案的注释所指出),尽管以上选项将在您选择的间隔内为您提供随机值,但也会更改分布和标准偏差与这些值相关联。如果这些值遵循正态分布对您很重要,请不要使用此选项。
选项2 用于使用rand()
,它始终返回间隔[0,1]
中的数字。请注意,这些来自均匀分布,而不是正态分布。然后,您可以先将这些值转换为间隔[-1,1]
:
z = rand(100,1);
z = 2*z - 1; % Translates the interval from [0,1] to [-1,1]
,然后像以前一样生成您的电话号码; y = 5000 + 500*z;
。
答案 1 :(得分:0)
或者是否有任何方法可以指定值应该在平均值加/减1 SD之间?
如果您使用的是正态分布(randn
),那么您就无法真正将数字限制在一定范围内,因为在正态分布中,只有无穷大和负无穷大为零概率,其余的概率很小,但可能发生。
或者,您可以使用其他分布,例如均匀(rand
)来将随机性限制为空白。