用给定的概率生成随机数matlab
我想生成一个给定的概率随机数,但我不知道如何:
我需要1到3之间的数字
num = ceil(rand*3);
但是我需要不同的值来产生不同的概率。
0.5 chance of 1 0.1 chance of 2 0.4 chance of 3
我确定这很简单,但我不知道该怎么做。
简单的解决scheme是生成一个统一分布的数字(使用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]))
只是将整数映射到其中一个段的一种奇特方式。
延期
如果你有兴趣创build一个随机数的向量/matrix,你可以使用循环或arrayfun
:
r = rand(3); % # Any size you want x = arrayfun(@(z)sum(z >= cumsum([0, prob])), r);
当然,也有一个vector化的解决scheme,我懒得写它。
>> c = cumsum([0.5, 0.1, 0.4]); >> r = rand(1e5, 1); >> x = arrayfun(@(x) find(x <= c, 1, 'first'), r); >> h = hist(x, 1:3) h = 49953 10047 40000
x
根据需要分配。
稍微更一般的解决scheme是:
r=rand; prob=[.5,.1,.4]; prob=cumsum(prob); value=[1,2,3]; %values corresponding to the probabilities ind=find(r<=prob,1,'first'); x=value(ind)
到目前为止的答案是正确的,但是对于大的input来说很慢:O(m * n)其中n是值的数量,m是随机样本的数量。 这是一个O(m * log(n))版本,利用cumsum
结果的单调性和cumsum
使用的二进制search:
% assume n = numel(prob) is large and sum(prob) == 1 r = rand(m,1); [~,x] = histc(r,cumsum([0,prob]));
相关的Matlab中心论坛线程
使用统计和机器学习工具箱中的 randsample
函数,可以生成具有指定概率质量函数(pmf)的随机数:
pmf = [0.5, 0.1, 0.4]; population = 1:3; sample_size = 1; random_number = randsample(population,sample_size,true,pmf);
我认为这是最简单的方法。