首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以预定义的非均匀概率在一定范围内生成随机数

以预定义的非均匀概率在一定范围内生成随机数
EN

Stack Overflow用户
提问于 2012-08-22 13:03:52
回答 1查看 812关注 0票数 0

我想生成1-10范围内的随机数。要求70%的数字应该在1-3的范围内生成,其余的30%在4-10的范围内生成。我正在使用boost来生成概率分布。我应该使用什么探测dist以及什么参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-22 13:15:24

调整我在Boost documentation中找到的代码,我相信以下内容应该可以解决问题:

代码语言:javascript
运行
复制
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/discrete_distribution.hpp>

int main() {
  double probabilities[] = {
      0.7/3, 0.7/3, 0.7/3, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7
  };
  boost::random::discrete_distribution<> dist(probabilities);

  /* For each number to generate: */
  int number = dist(gen) + 1; // to get range 1-10 rather than 0-9

  return 0;
}

严格地说,它所做的是将70%的概率分配给数字1-3 (70%的概率质量在1,2和3之间均匀分布),30%到4-10 (同样,在它们之间均匀分布)。这并不能保证你得到的数字中70%是1-3,30%是4-10。这只意味着随着它的增长,输出很可能会收敛到该分布。

如果你想实际保证70%的数字是1-3,30%的数字是4-6,你必须定义两个均匀分布:

代码语言:javascript
运行
复制
boost::random::uniform_int_distribution<> dist1(1, 3);
boost::random::uniform_int_distribution<> dist2(4, 10);

然后,要生成N个随机数,您可以从dist1中提取N*0.7时间,从dist2中提取N*0.3时间,将所有这些数字放入一个std::vector中并应用std::random_shuffle()。这将保证70:30的要求(除了可能的舍入误差取决于N)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12066565

复制
相关文章

相似问题

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