linux g++ 随机数问题

有如下代码

#include <iostream>
#include <random>

static std::default_random_engine _generator(time(0));

int random_from(const int start_n ,const int end_n )
{
	std::uniform_int_distribution<int> dest(start_n , end_n);
	return dest(_generator);
}

using namespace std;
int main(int argc, char *argv[]) {
	std::cout << random_from(1, 100) << std::endl;
}

在OSX中运行,结果是随机的,在linux用gcc 4.9.2编译,每次运行结果都一样,就像是没有设置随机种子一样。

换了gcc 5.1.0编译,还是没什么卵用。于是写了个程序测试

#include <iostream>
#include <map>
#include <random>


using namespace std;
int main(int argc, char *argv[]) {
	std::map<int, int> s;
	for(int i = time(0); i < time(0)+10000; i++)
	{
		std::default_random_engine _generator(i);
		std::uniform_int_distribution<int> dest(1 , 10000);
		s[dest(_generator)]++;
	}

	for(auto item : s)
	{
		std::cout << item.first << "=" << item.second << std::endl;
	}
}

测试发现第一次随机出来的不同值在780个左右,这个default_random_engine对于随机种子不太敏感,连续N个整数,都被当成同一个种子对待。

于是改用random_device来作为随机种子。

#include <iostream>
#include <map>
#include <random>


using namespace std;
int main(int argc, char *argv[]) {
	std::map<int, int> s;
	for(int i = time(0); i < time(0)+10000; i++)
	{
		std::random_device rd;
		std::default_random_engine _generator(rd());
		std::uniform_int_distribution<int> dest(1 , 10000);
		s[dest(_generator)]++;
	}

	for(auto item : s)
	{
		std::cout << item.first << "=" << item.second << std::endl;
	}
}

Published: June 12 2015

  • category: