生成非负随机数(matlab)

时间:2014-01-19 04:17:50

标签: matlab

我想在matlab中生成N维列向量,平均值为0.5(方差可以调整),但我希望所有数字都是正数,有人知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

这取决于您想要的分布。 rand(v)函数在维度为[0,1]的数组中生成一个统一的随机分布(范围v我相信虽然我不确定0或1是理论上可能的值)。

因此,如果你想要一个3x4x5x6数组,你可以做

myRandArray = rand([3 4 5 6]);

如果您希望较高的值更大,则可以执行

myRandArray = maxVal * rand([3 4 5 6]);

maxVal是最大值。如果您想要范围minValmaxVal,请执行

myRandArray = minVal + (maxVal - minVal) * rand([3 4 5 6]);

对于其他发行版(例如正常发布的randn),您可以明显地对上述进行调整。如果您想要“截断的正态分布” - 您可能需要从太多的值开始:

dims = [3 4 5 6];
n = prod( dims );
tooMany = 0.5 + randn(2 * n); % since you want mean = 0.5
tooMany(tooMany < 0) = [];
if numel( tooMany ) > n
  myRandArray = reshape(tooMany(1:n), dims);
end

你可以明显改善这一点,但这是一个普遍的想法。

例如,您只能生成n个值,查看失败的数量(比如m),然后生成另一个m * n /(n - m),并根据需要重复,直到您确切地为n。< / p>

请注意,由于我们切断尾部,最终分布的平均值不再是0.5。如果排除某些值,则“正态分布”不能保持“正常”。但是你没有指定你想要的分发......

答案 1 :(得分:0)

你可以试试这个:

E.g。创建一个从正态分布中抽取的1000个随机值的向量,平均值为0.5,标准差为5。

a = 5;
b = 0.5;
y = a.*randn(1000,1) + b;

为了使其成为正数,那么您可以删除所有负数或零的数字并生成更多数字,直到您得到n个正数。

查看here了解详情。

相关问题