gpt4 book ai didi

c++ - 在 CPP 运行时选择随机数生成器

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:44 25 4
gpt4 key购买 nike

我可能做了比必要更多的努力,但谁在乎呢,让我们尝试解决这个问题:我想使用 <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;

最佳答案

This documentation表示 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;
}

关于c++ - 在 CPP 运行时选择随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56922258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com