首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任意编程语言中带约束的随机数生成

任意编程语言中带约束的随机数生成
EN

Stack Overflow用户
提问于 2014-04-16 08:14:38
回答 2查看 1.1K关注 0票数 1

我想生成150个随机数,值为正整数(1,2,3,4,5.....),这样所有随机数的和就是270,

代码语言:javascript
复制
Prob[1] = 0.405
Prob[2] = 0.345
Prob[3] = 0.125
Prob[4] = 0.092
Prob[>=5] = 0.033

基本上,所有随机数的和是固定的,概率是固定的,随机数应该取大于0的值。

有人知道如何用python/MATLAB/C或任何其他编程语言生成它吗?

EN

回答 2

Stack Overflow用户

发布于 2014-04-16 09:20:28

修改该表,使其具有累积概率和:

代码语言:javascript
复制
[ 0.405, 0.750, 0.875, 0.967, 1.0 ] 

从(0.0,1.0)中绘制均匀随机数。搜索表中大于所绘制数字的最小条目;索引是您的值。加到总数上。重复149次。

从270中减去总数,得到最后一个。

票数 1
EN

Stack Overflow用户

发布于 2014-04-16 09:49:12

要使其相加到270,可能需要重复生成从指定分布中获取的150个样本组,直到样本数相加为270。但是,在这种情况下,值的分布将不会非常接近所需的分布。

在MATLAB中,最简单的方法是使用randsample,它是信号处理工具箱的一部分。例如,

代码语言:javascript
复制
randsample(1:5, 150, true, [0.405 0.345 0.125 0.092 0.033])

运行它,直到输出总和为270:

代码语言:javascript
复制
rsum = 0;
while rsum~=270,
    rs = randsample(1:5, 150, true, [0.405 0.345 0.125 0.092 0.033]);
    rsum = sum(rs);
end

对于大于5的值,也许可以将样本==5替换为从[5,Inf)上的均匀分布中获得的新数字,或者最多可以到intmax

代码语言:javascript
复制
fives = rs==5;
rs(fives) = randi(intmax-5+1,nnz(fives)+100,1)+5-1

如果您没有randsample,可以按如下方式制作样例。

代码语言:javascript
复制
N = 150;
vals = 1:5;
p = [0.405 0.345 0.125 0.092 0.033];

cdf = [0 cumsum(p(:).'/sum(p))]; cdf(end)=1;
[~, isamps] = histc(rand(N,1),cdf);
rs = vals(isamps);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23096760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档