所以,我正在尝试模拟一袋弹珠的任意模型(如果这会影响它的工作方式,那就更换了)并且遇到了显示结果的问题。
我是如何设置的是代码询问包中有多少弹珠,你想挑选多少,然后有多少种颜色。 (分别定义为N,S和k)。
然后,我在单元格数组中通过1和k之间的循环来命名大理石的颜色,然后创建第二个数组,通过询问包中每种颜色的数量来模拟概率。
然后我生成一个模拟10个“游戏”的随机矩阵(即:rDist=randi(N,[10,S]
);
现在我已经选择了大理石,我创建了另一个10xS单元阵列,并希望根据拾取的数量用大理石的颜色填充该单元阵列。也就是说,假设我有10个弹珠,7个是红色,3个是绿色。如果PRNG选择1:7,我希望结果单元格数组说“红色”,如果它选择8:10,我想在相应的位置“绿色”。我可以为有限的数字做这个,但我想把它扩展到K大理石颜色,任意数量的大理石颜色分布。你能提供任何帮助吗?
我对2种大理石类型的“有限”解决方案如下:
for lc=1:10*S
counter=0;
if (rDist(lc)>=1 && (rDist(lc)<=Probabilities(1)))
Results{lc}=Color{1};
end
counter=Probabilities(1);
if (rDist(lc)>counter && (rDist(lc)<=counter+Probabilities(2)))
Results{lc}=Color{2};
end
end
答案 0 :(得分:1)
您可以使用cumsum
计算与每种颜色对应的间隔。然后,您需要找到rDist
的每个条目所属的区间。
numPicks = 5;
numGames = 10;
names = {'red', 'white', 'blue'};
counts = [2 6 9];
N = sum(counts);
cumsumCounts = cumsum(counts);
rDist=randi(N, [numGames, numPicks]);
out = cell(size(rDist));
for i = length(counts):-1:1
out(rDist <= cumsumCounts(i)) = names(i);
end
您也可以使用通讯系统工具箱中的quantiz
或统计信息和机器学习工具箱中的randSample
执行此操作。最后,您可以使用更混乱的单行out = names(arrayfun( @(x)( find(cumsumCounts >= x, 1) ), rDist));