生成非负随机数(matlab)

生成非负随机数(matlab),matlab,Matlab,我想在matlab中生成一个N维列向量,平均值为0.5(方差可以调整),但我希望所有数字都是正数,有人知道怎么做吗 这取决于您想要的分布。rand(v)函数在维度为v的数组中生成一个均匀的随机分布(范围[0,1]我相信,尽管我不确定0或1是否是理论上可能的值) 因此,如果您想要一个3x4x5x6数组,您可以这样做 myRandArray = rand([3 4 5 6]); 如果希望上限值更大,可以这样做 myRandArray = maxVal * rand([3 4 5 6]); 其中,

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

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

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

myRandArray = rand([3 4 5 6]);
如果希望上限值更大,可以这样做

myRandArray = maxVal * rand([3 4 5 6]);
其中,
maxVal
是最大值。如果您想要一个从
minVal
maxVal
的范围,请执行以下操作

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
dims=[3 4 5 6];
n=产品(dims);
太多=0.5+随机数(2*n);%因为你想要平均值=0.5
太多(太多<0)=[];
如果numel(太多)>n
myRandArray=重塑(太多(1:n),变暗);
结束
你显然可以在这方面有所改进,但这只是一个总体想法

例如,您可以只生成
n
值,查看有多少失败(比如m),然后生成另一个m*n/(n-m),并根据需要重复,直到正好有n个

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

您可以尝试以下方法:

例如,从正态分布中提取1000个随机值,创建一个向量,平均值为0.5,标准偏差为5

a = 5;
b = 0.5;
y = a.*randn(1000,1) + b;
若要使其为正数,则可以删除所有负数或零,并生成更多的数字,直到得到n个正数


查看更多信息。

正数还是非负数?阅读此文您关心数字的分布吗?我刚刚注意到“N维列向量”。根据定义,列向量是一个domensional。你是说“有N个元素”吗?如果是这样的话,
rand(N,1)
可能就是你所需要的。使用
abs
使这不再是一个随机分布。当然,去除负值也是如此……但我认为后者对分布中>0@Floris年,
abs
是一个糟糕的选择。更新。谢谢