我想创建一组随机数。我使用了以下代码:
for i = 1:n
for j = 1:n
Sc{i,j} = sort((randperm(m,randi(m))));
end;
end;
这将创建一个包含一组从1到5的随机整数的单元数组。例如Sc {1,1} = [1,3,4]我认为,randi函数使用均匀分布。我想用一些概率来控制集合的大小。例如,我希望我的集合包含概率为.5的所有5个元素(大小为5),以及包含4,3,2,1个元素的集合,每个元素的概率为.1。我不知道如何在matlab中编写代码。请帮忙。我对这个软件还不熟悉
答案 0 :(得分:0)
这应该可以解决问题。基本上你需要做什么,因为实际上没有直接定义自定义加权分布的方法,你可以简单地创建一个更频繁地具有更高权重元素的数组,然后统一采样该数组。因此,如果某个元素的概率为0.5,那么创建的数组中的一半元素将是该值,概率为0.5。然后,如上所述,只需使用randi
(使用整个数组长度)从该数组中选择一个索引,该索引将遵循您的自定义分布。
见下面的代码
sizes = [1,2,3,4,5];
probs = [0.125,0.125,0.125,0.125,0.5];
% some initial sanity checks.
assert(numel(sizes) == numel(probs),'probability must be defined for each size')
assert(sum(probs)==1,'Probabilities must sum to 1')
numEach = round((probs/min(probs)));
weightedSizes = zeros(1,sum(numEach));
start = 1;
for i = 1:numel(sizes)
weightedSizes(start:start+numEach(i)-1) = sizes(i);
start = start+numEach(i);
end
holder = cell(1,10);
for i = 1:10
randSize = weightedSizes(randi(numel(weightedSizes)));
holder{i} = randperm(randSize);
end
注意,如果您的概率非常小,请务必小心使用此方法,因为它会创建一个非常大的矩阵。这是因为它假设概率最小的元素只出现一次。元素将与1/min(probability)