使用给定概率matlab生成随机数

时间:2012-12-17 12:20:40

标签: matlab math random probability

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

我需要1到3之间的数字

num = ceil(rand*3);

但是我需要不同的值才能产生不同的生成概率。

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

我确信这很简单,但我想不出怎么做。

6 个答案:

答案 0 :(得分:46)

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

当然,还有一个矢量化解决方案,我只是懒得写它。

答案 1 :(得分: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]));

答案 2 :(得分:5)

>> 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根据需要分发。

答案 3 :(得分: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)

答案 4 :(得分:4)

使用 Statistics and Machine Learning Toolbox 中的randsample函数,您可以生成具有指定概率质量函数(pmf)的随机数:

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

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

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

答案 5 :(得分:0)

当概率是像这样的好数字时,可以进行非常简单而有效的选择。我们重复总体元素,以使均匀选择产生所需的概率分布。在这种情况下,我们创建了一个10人口,其中5乘以1(被选择的概率为0.5),等等。

p = [1,1,1,1,1,2,3,3,3,3];
x = p(randi(numel(p));

randi使用第二个输入参数来确定输出的大小(默认为1),因此很容易从此分布中生成许多值。