用给定的概率生成随机数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); 

我认为这是最简单的方法。