3 回答
TA贡献1858条经验 获得超8个赞
简单的解决方案是生成一个具有均匀分布的数字(使用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]));
说明
这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);
当然,还有矢量化解决方案,我太懒了,无法编写它。
TA贡献1844条经验 获得超8个赞
到目前为止,答案是正确的,但对于大输入而言,答案很慢:O(m * n)其中,n是值的数量,m是随机样本的数量。这是一个O(m * log(n))版本,该版本利用了cumsum结果的单调性和用于以下内容的二进制搜索histc:
% assume n = numel(prob) is large and sum(prob) == 1
r = rand(m,1);
[~,x] = histc(r,cumsum([0,prob]));
- 3 回答
- 0 关注
- 635 浏览
添加回答
举报