模拟任意一袋弹珠

时间:2015-08-14 08:27:30

标签: matlab statistics probability n-dimensional

所以,我正在尝试模拟一袋弹珠的任意模型(如果这会影响它的工作方式,那就更换了)并且遇​​到了显示结果的问题。

我是如何设置的是代码询问包中有多少弹珠,你想挑选多少,然后有多少种颜色。 (分别定义为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

1 个答案:

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