生成与给定的概率MATLAB随机数(Generate random number with give

2019-07-05 13:54发布

我想生成具有给定概率的随机数,但我不知道如何:

我需要1和3之间的数

num = ceil(rand*3);

但我需要不同的值有产生例如不同的概率。

0.5 chance of 1
0.1 chance of 2
0.4 chance of 3

我敢肯定,这是简单,但我想不出如何做到这一点。

Answer 1:

简单的解决方案是,以产生具有均匀分布(使用数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);

当然,也有一个量化的解决方案,我只是懒得写。



Answer 2:

答案为止都正确,但慢对于大输入: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]));


Answer 3:

>> 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如所期望分布。



Answer 4:

稍微更一般的解决办法是:

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)


Answer 5:

使用randsample统计和机器学习工具箱功能,可以生成与指定概率质量函数(PMF)随机数:

pmf = [0.5, 0.1, 0.4];
population = 1:3;
sample_size = 1;

random_number = randsample(population,sample_size,true,pmf);

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



文章来源: Generate random number with given probability matlab