简单的解决方案是生成一个均匀分布的数字(使用rand),并对其进行一些操作:
r = rand;
prob = [0.5, 0.1, 0.4];
x = sum(r >= cumsum([0, prob]));
或者单行:
x = sum(rand >= cumsum([0, 0.5, 0.1, 0.4]));
解释
Here r
是 0 到 1 之间均匀分布的随机数。要生成 1 到 3 之间的整数,技巧是将 [0, 1] 范围分为 3 段,其中每段的长度与其对应的概率成正比。就您而言,您将拥有:
- 段[0, 0.5),对应数字1。
- 段[0.5,0.6),对应数字2。
- 段[0.6, 1],对应数字3。
的概率r
落在任何分段内的概率与您想要的每个数字的概率成正比。sum(r >= cumsum([0, prob]))
只是将整数映射到其中一个段的一种奇特方式。
扩大
如果您有兴趣创建随机数向量/矩阵,可以使用循环或arrayfun:
r = rand(3); % # Any size you want
x = arrayfun(@(z)sum(z >= cumsum([0, prob])), r);
当然,还有一个向量化的解决方案,我只是懒得写了。