你可以做一些简单的事情,如下所示。只需使用rand 创建一个大的随机向量,这将创建具有统一概率的 0 和 1 之间的值。因此,如果您希望某个数字有 10% 的发生机会,您可以给它一个 0.1 的范围,通常是 0 到 0.1。然后,您可以为这些相同的数字添加更多范围以获得您想要的结果。
vals =rand(1,10000);
letters = cell(size(vals));
[letters{vals<0.1}] = deal ('a');
[letters{vals > 0.1 & vals <= 0.6}] = deal ('b');
[letters{vals > 0.6 & vals <= 0.8}] = deal ('c');
[letters{vals > 0.8 & vals <= 1}] = deal ('d');
上面的代码将返回一个包含百分比的 10000 个字符的字母数组。
或者您可以按如下方式动态执行此操作:
vals =rand(1,10000);
output= cell(size(vals));
letters2use = {'a','b','c','d'};
percentages = [0.1,0.5,0.2,0.2];
lowerBounds = [0,cumsum(percentages(1:end-1))];
upperBounds = cumsum(percentages);
for i = 1:numel(percentages)
[output{vals > lowerBounds(i) & vals <= upperBounds(i)}] = deal(letters2use{i}) ;
end
更新
上面的代码不能保证每个字母出现一定的次数,但是下面的代码可以。由于从您的评论看来,您似乎需要一定数量的每个以下代码应该通过随机分配字母来做到这一点
numElements = 10000;
letters2use = {'a','b','c','d'};
percentages = [0.1,0.5,0.2,0.2];
numEach = round(percentages*numElements);
while sum(numEach) < numElements
[~,idx] = max(mod(percentages*numElements,1));
numEach(idx) = numEach(idx) + 1;
end
while sum(numEach) > numElements
[~,idx] = min(mod(percentages*numElements,1));
numEach(idx) = numEach(idx) - 1;
end
indices = randperm(numElements);
output = cell(size(indices));
lower = [0,cumsum(numEach(1:end-1))]+1;
upper = cumsum(numEach);
for i = 1:numel(lower)
[output{indices(lower(i):upper(i))}] = deal(letters2use{i});
end
output