我正试图理解c++11中不同的发行对象,我发现它是压倒一切的。我希望你们中的一些人能够也会有所帮助。
这就是为什么我要调查这一切:
我需要一个随机数生成器,我可以调整每次使用它,以便它更有可能产生相同的数字再次。我需要填写的第二个要求是,我需要生成的随机数仅为以下数字:{1, 2, 4, 8, 16, ..., 128}
第三个也是最后一个要求是,在某些情况下,我需要跳过上述集合中的一个或多个数字。
我的问题是,我不理解各种分布对象的描述。因此,我无法确定我需要使用什么工具来满足我的上述需求。
有人能告诉我我需要什么工具吗?我需要怎样使用它们?反应越清楚、越简洁、越详细,越好。
发布于 2014-08-02 21:52:59
可以在0,7范围内使用随机数j生成范围,然后计算:
1 << j得到你的电话号码。std::uniform_int_distribution<>可以方便地生成0,7中的值。
此外,您还可以使用一个std::bernoulli_distribution (它返回一个随机的bool)来决定下一个数字是否将与最后一个数字相同,或者您是否应该生成一个新的数字。std::bernoulli_distribution默认为50/50的真/假概率,但您可以在bernoulli_distribution构造函数中将该发行版自定义为您喜欢的任何东西(例如,80/20或其他什么)。
如果这还不够清楚,只需使用一些代码即可。试着对它进行编码,如果它不起作用,发布你所拥有的,我相信有人会帮上忙的。
哦,忘了你的第三个要求:那就把你的0,7代放在一个循环中,如果你想出一个数字,你应该跳过,然后迭代循环,否则打破它。
发布于 2015-04-07 22:51:56
对于跳过数字,我完全同意Howard的观点,手动检查可能是可行的,但可能有更好的方法来改变生成给定数字的概率。另一种方法是使用discrete_distribution对象,它允许您指定生成任何给定值的概率,因此对于您的示例来说,它将类似于
std::default_random_engine entropy;
std::array<double, 128> probs;
probs.fill(1.0);
std::discrete_distribution<int> choose(probs.begin(), probs.end());然后,当您在循环中时,除了决定是否跳过之外,您还可以在一定程度上增加其中一个值,从而增加再次出现该值的可能性,确保重新初始化离散分布,如下所示:
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的函数,并分别对生成的值执行您想要的任何操作。
https://stackoverflow.com/questions/25099585
复制相似问题