在MATLAB中使用randn生成随机数

时间:2018-11-20 09:42:45

标签: matlab random

我正在MATLAB中使用randn来生成给定均值和标准差的一组随机数。

b=5000;
a=500;
y = a.*randn(100,1) + b;
sprintf('%f\n',y)

我希望生成的数字在4500到5500之间。但是,我看到的值在3000到6000之间。

有人可以解释为什么会这样吗?

或者是否有任何方法可以指定这些值应该在平均值正负1 SD之间?

2 个答案:

答案 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)。然后,您可以使用ba的值在您选择的间隔内将值转换为随机数。

编辑:请注意(如该答案的注释所指出),尽管以上选项将在您选择的间隔内为您提供随机值,但也会更改分布和标准偏差与这些值相关联。如果这些值遵循正态分布对您很重要,请不要使用此选项。

选项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之间?

by definition.

如果您使用的是正态分布randn),那么您就无法真正将数字限制在一定范围内,因为在正态分布中,只有无穷大和负无穷大为零概率,其余的概率很小,但可能发生。

或者,您可以使用其他分布,例如均匀(rand)来将随机性限制为空白。