0

所以,我正在尝试模拟一袋弹珠的任意模型(如果这对它的工作方式有影响,则进行替换)并且遇到了显示结果的问题。

我的设置是代码询问袋子里有多少弹珠,你想挑选多少,然后有多少种不同的颜色。(分别定义为 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
4

1 回答 1

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

于 2015-08-14T10:51:14.393 回答