为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

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


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


num = ceil(rand*3);

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


0.5 chance of 1

0.1 chance of 2

0.4 chance of 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 want

x = arrayfun(@(z)sum(z >= cumsum([0, prob])), r);

当然,还有矢量化解决方案,我太懒了,无法编写它。


查看完整回答
反对 回复 2019-10-11
?
泛舟湖上清波郎朗

到目前为止,答案是正确的,但对于大输入而言,答案很慢: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]));


查看完整回答
反对 回复 2019-10-11
?
达令说

使用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);

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


查看完整回答
反对 回复 2019-10-11

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信