注意:
以下是代码:
#include <iostream>
#include <random>
#include <cstdlib>
#include <ctime>
#include <chrono>
int main() {
srand(time(0));
long long seed = rand();
std::default_random_engine rand_num(seed);
std::uniform_int_distribution<long long> range(0, 10);
long long a = range(rand_num);
long long b = rand_num();
std::cout<<seed<<"\n"; // the seed is different every time (tested)
std::cout<<a<<"\n";
std::cout<<b<<"\n";
system("pause");
return 0;
}
使用std :: uniform_int_distribution(a)的那个在我自己的计算机上运行代码时不是随机的,但是可以正常工作并在在线IDE上创建一个随机数。
没有std :: uniform_int_distribution(b)的人可以使用在线IDE和我自己的计算机。
有什么问题?我该如何解决?
更新:代码与mt19937引擎(std :: mt19937和std :: mt19937_64)正常工作
答案 0 :(得分:2)
这似乎是Windows上g ++实现的已知问题。查看类似问题的已接受答案:Why do I get the same sequence for every run with std::random_device with mingw gcc4.8.1?
为避免此问题,您可以使用<chrono>
工具为随机数生成器播种:
#include <iostream>
#include <random>
#include <cstdlib>
#include <ctime>
#include <chrono>
int main() {
srand(time(0));
long long seed = rand();
std::default_random_engine rand_num{static_cast<long unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())};
// ^ ^ ^ ^ ^ ^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
std::uniform_int_distribution<long long> range{1,10};
long long a = range(rand_num);
long long b = rand_num();
std::cout<<seed<<"\n"; // the seed is different every time (tested)
std::cout<<a<<"\n";
std::cout<<b<<"\n";
system("pause");
return 0;
}
这给了我每次运行时的不同结果(在Windows上使用g ++)。
答案 1 :(得分:1)
您的代码在Visual C ++中运行良好,但g ++ 5.2.0对我来说失败了。它看起来像是gcc标准库中的一个错误。
更多证据表明使用default_random_engine
一般来说只是一个坏主意,并且使用time(0)
作为种子也非常糟糕(尽管快速检查表明将其更改为使用{{种子的1}}仍会产生破碎的结果。)