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

请问怎么用给定的概率矩阵生成随机数

请问怎么用给定的概率矩阵生成随机数

RISEBY 2019-11-03 10:04:31
我想以给定的概率生成一个随机数,但不确定如何:我需要一个介于1到3之间的数字num = ceil(rand*3);但我需要不同的值才能产生不同的概率,例如0.5 chance of 10.1 chance of 20.4 chance of 3我敢肯定这很简单,但我想不出该怎么做。
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

简单的解决方案是生成一个具有均匀分布的数字(使用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-11-04
?
婷婷同学_

TA贡献1844条经验 获得超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]));



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 594 浏览

添加回答

举报

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