用给定的概率矩阵生成随机数

我想以给定的概率生成一个随机数,但不确定如何:


我需要一个介于1到3之间的数字


num = ceil(rand*3);

但我需要不同的值才能产生不同的概率,例如


0.5 chance of 1

0.1 chance of 2

0.4 chance of 3

我敢肯定这很简单,但我想不出该怎么做。


摇曳的蔷薇
浏览 740回答 3
3回答

暮色呼如

简单的解决方案是生成一个具有均匀分布的数字(使用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 wantx = arrayfun(@(z)sum(z >= cumsum([0, prob])), r);当然,还有矢量化解决方案,我太懒了,无法编写它。

泛舟湖上清波郎朗

到目前为止,答案是正确的,但对于大输入而言,答案很慢:O(m * n)其中,n是值的数量,m是随机样本的数量。这是一个O(m * log(n))版本,该版本利用了cumsum结果的单调性和用于以下内容的二进制搜索histc:% assume n = numel(prob) is large and sum(prob) == 1r = rand(m,1);[~,x] = histc(r,cumsum([0,prob]));
打开App,查看更多内容
随时随地看视频慕课网APP