C++11 自定义随机数的分布

C++11 自定义随机数的分布,c++11,random,C++11,Random,我试图理解c++11中的不同分布对象,我发现这一点非常重要。我希望你们中的一些人能够并将提供帮助 这就是为什么我要调查这一切: 我需要一个随机数发生器,我可以调整每次使用它,使它更有可能再次产生相同的数字。我需要填写的第二个要求是,我需要生成的随机数仅为以下数字: {1,2,4,8,16,…,128} 第三个也是最后一个要求是,在某些情况下,我需要跳过上述集合中的一个或多个数字 我的问题是我不理解各种分布对象的描述。一、 因此,我无法确定我需要使用什么工具来满足上述需求 有人能告诉我我需要什么

我试图理解c++11中的不同分布对象,我发现这一点非常重要。我希望你们中的一些人能够并将提供帮助


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

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

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

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


有人能告诉我我需要什么工具以及如何使用它们吗?响应越清晰、简洁和详细越好。

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

1 << j

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

std::default_random_engine entropy;
std::array<double, 128> probs;
probs.fill(1.0);
std::discrete_distribution<int> choose(probs.begin(), probs.end());
std::default\u random\u引擎熵;
std::数组probs;
问题填充(1.0);
离散分布选择(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);
}
intx;
双myValue=0.2//或者任何你想要的增量
为了(某物;某物;某物)
{
x=选择(熵);
if(跳过(x))
continue;//或者您可以将probs.at(x)=0
//除非你再也不想生成它
(x)+=myValue时的概率;
choose=std::离散分布(probs.begin(),probs.end());
输出(x);
}

其中skip和output是您的函数,用于决定是否应跳过x,并分别对生成的值执行任何操作

我是否认为您的回答意味着没有办法使用这些新的c++11对象/模板来指定特定的数字?也谢谢你的回答!统一的_int_分布允许您指定下限和上限,并生成[low,high]范围内的整数。大多数其他分布返回的浮点结果具有各种概率分布;但没有mid算法对分布对象进行重新初始化。自从使用std::bernoulli_发行版遇到意外行为以来,我一直在想,重新初始化对象是否会扭曲我根据在初始化过程中可以从对象获得的统计信息所期望的累积统计信息。初始化是否如您所建议的那样减轻了我的担忧?我重新初始化的唯一原因是离散分布基于初始化时传递的数组生成,因此如果您更改该数组(在我给出的示例中是这样做的),并希望分布反映您需要重新初始化的更改(除非我错过了更优雅的方式)。对于伯努利分布,除非您更改初始化时传入的双精度值,否则重新初始化不应对总体统计数据产生任何影响。我猜想,如果您遇到伯努利分布的意外行为,这是一个单独的问题。我所知的唯一相似之处是对象。显然,它们是不同的对象,行为也会不同,但初始化是我怀疑的。我应该在某个时候做一些测试,但我就是找不到时间。在我消除任何担心之前,关于重新初始化会导致数据累积倾斜的问题,我会更习惯于双对象解决方案重新生成与上一代相同的数量。