首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机数的自定义分布

随机数的自定义分布
EN

Stack Overflow用户
提问于 2014-08-02 21:28:58
回答 2查看 744关注 0票数 2

我正试图理解c++11中不同的发行对象,我发现它是压倒一切的。我希望你们中的一些人能够也会有所帮助。

这就是为什么我要调查这一切:

我需要一个随机数生成器,我可以调整每次使用它,以便它更有可能产生相同的数字再次。我需要填写的第二个要求是,我需要生成的随机数仅为以下数字:{1, 2, 4, 8, 16, ..., 128}

第三个也是最后一个要求是,在某些情况下,我需要跳过上述集合中的一个或多个数字。

我的问题是,我不理解各种分布对象的描述。因此,我无法确定我需要使用什么工具来满足我的上述需求。

有人能告诉我我需要什么工具吗?我需要怎样使用它们?反应越清楚、越简洁、越详细,越好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-02 21:52:59

可以在0,7范围内使用随机数j生成范围,然后计算:

代码语言:javascript
复制
1 << j

得到你的电话号码。std::uniform_int_distribution<>可以方便地生成0,7中的值。

此外,您还可以使用一个std::bernoulli_distribution (它返回一个随机的bool)来决定下一个数字是否将与最后一个数字相同,或者您是否应该生成一个新的数字。std::bernoulli_distribution默认为50/50的真/假概率,但您可以在bernoulli_distribution构造函数中将该发行版自定义为您喜欢的任何东西(例如,80/20或其他什么)。

如果这还不够清楚,只需使用一些代码即可。试着对它进行编码,如果它不起作用,发布你所拥有的,我相信有人会帮上忙的。

哦,忘了你的第三个要求:那就把你的0,7代放在一个循环中,如果你想出一个数字,你应该跳过,然后迭代循环,否则打破它。

票数 2
EN

Stack Overflow用户

发布于 2015-04-07 22:51:56

对于跳过数字,我完全同意Howard的观点,手动检查可能是可行的,但可能有更好的方法来改变生成给定数字的概率。另一种方法是使用discrete_distribution对象,它允许您指定生成任何给定值的概率,因此对于您的示例来说,它将类似于

代码语言:javascript
复制
std::default_random_engine entropy;
std::array<double, 128> probs;
probs.fill(1.0);
std::discrete_distribution<int> choose(probs.begin(), probs.end());

然后,当您在循环中时,除了决定是否跳过之外,您还可以在一定程度上增加其中一个值,从而增加再次出现该值的可能性,确保重新初始化离散分布,如下所示:

代码语言:javascript
复制
int x;
double myValue = 0.2;//or whatever increment you want
for (something; something else; something else else)
{
  x = choose(entropy);
  if (skip(x))
    continue;//alternately you could set probs.at(x) = 0
  //only if you never want to generate it again
  probs.at(x) += myValue;
  choose = std::discrete_distribution<int>(probs.begin(), probs.end());
  output(x);
}

其中,跳过和输出是您决定是否应该跳过x的函数,并分别对生成的值执行您想要的任何操作。

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

https://stackoverflow.com/questions/25099585

复制
相关文章

相似问题

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