好吧,我开始失去理智.我想做的只是随机的0到410之间的数字,根据这个页面,我的代码应该这样做.因为我想要一个随机数而不是伪随机数,所以我也使用srand(),例如这个线程告诉我这样做.但这不起作用.我得到的只是一个数字,取决于我上次执行以来的时间.如果我尽可能快地再次执行它,那么数字通常比最后一个数字高6个数字,如果我等待更长时间,它会更高,等等.当它达到410时,它会回到0并重新开始.我错过了什么?
编辑:哦,如果我删除该srand(time(NULL));行,我每次运行程序时都得到相同的数字(41).这甚至不是伪随机的,这只是一个静态数字.只是从我上面链接的文章复制第一行代码仍然给我41号.我是"23号"续集中的明星,还是我错过了什么?
int main(void) {
srand(time(NULL));
int number = rand() % 410;
std::cout << number << std::endl;
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
这就是使用弃用的随机数生成所得到的.
rand 产生一个固定的数字序列(这本身就很好),非常非常糟糕.
你告诉序列rand从srand哪里开始.由于您的"起点"(称为种子顺便说一句)取决于自1.1.1970 0:00:00 UTC以来的秒数,因此您的输出显然是时间依赖的.
执行您想要执行的操作的正确方法是使用C++ 11 <random>库.在您的具体示例中,这看起来有点像这样:
std::mt19937 rng (std::random_device{}());
std::uniform_int_distribution<> dist (0, 409);
auto random_number = dist(rng);
Run Code Online (Sandbox Code Playgroud)
有关的罪恶的详细信息rand和优点<random>看看这个.
作为最后一句话,std::mt19937像我上面那样播种并不是最佳选择,因为MT的状态空间远大于单次调用中的32位std::random_device{}().这不是玩具程序和标准学校作业的问题,而是供参考:这是我对MT整个州空间播种的看法,以及答案中的一些有用的建议.