如何以一定的概率在单元格数组中创建随机数

时间:2013-12-16 21:43:56

标签: matlab

我想创建一组随机数。我使用了以下代码:

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中编写代码。请帮忙。我对这个软件还不熟悉

1 个答案:

答案 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)

一样多