1

我可能付出了不必要的努力,但谁在乎呢,让我们尝试解决这个问题:我想<random>在我的代码中使用“random_device”生成器。但这在某些系统上可能不可用(根据规范),所以我希望 mt19937 作为备份(但无论我使用什么生成器,我都希望最后有相同的变量名)。现在,我可以试试 random_device 看看它是否工作正常,但接下来呢?如果我使用 if 语句,我的生成器将在 if 之后消失。如果我声明它,之后我将无法更改类型。在代码下方,这不起作用

bool random_working=true;
try
{
    random_device rd; //throws exception when not able to construct
}
catch(exception& e)
{
    cout<<"Exception: ''random_device'' not working, switching back to mt19937"<<endl;
    random_working=false;
}
if(random_working)
    random_device mc; //for _M_onte-_C_arlo
else
        mt19937 mc;
4

1 回答 1

0

该文档说这std::random_device可能是某些平台上的确定性来源,因此始终导致相同的序列。

您可以始终保持它std::mt19937seed()时间相关的东西,就像在过去的美好时光std::rand()std::srand()

然后你将不得不使用一个随机分布来消耗这个随机生成器并为你提供你期望的随机值。

例如

#include <iostream>
#include <random>
#include <chrono>

int
main()
{
  //-- create and seed a general purpose random generator --
  using gen_t = std::mt19937;
  const auto now{std::chrono::system_clock::now().time_since_epoch()};
  const auto seed=gen_t::result_type(
    std::chrono::duration_cast<std::chrono::microseconds>(now).count());
  gen_t rndGen{seed};

  //-- create a uniform distribution of integer values in [0;255] --
  std::uniform_int_distribution<int> uniDist{0, 255};

  //-- draw a random integer value --
  const int guessThatInteger=uniDist(rndGen);

  std::cout << guessThatInteger << '\n';
  return 0;
}
于 2019-07-07T13:11:30.480 回答