程序在每次运行时生成相同的随机数?

时间:2011-09-29 03:29:09

标签: c++ random minesweeper

我刚刚完成了扫雷类型游戏的编码,除了每次运行应用程序之外,一切都很好,它生成相同的数字(我运行了3次不同的时间,将输出保存为3个文本文件并使用{{ 1}}在Linux中的命令,它没有发现任何差异)。它由diff播种,所以每次都应该改变,对吗?

这是我的代码:

的main.cpp

time(NULL)

3 个答案:

答案 0 :(得分:8)

  

按时间播种(NULL)

如果是的话,我看不到它。实际上,在代码中搜索它不会返回任何内容。如果您没有显式播种,则默认行为与您使用值1播种时的默认行为相同。

您需要明确说明:

srand (time (NULL));

在某个地方main的开头(并确保您一次只执行一次)。

虽然记住这会使它依赖于当前时间 - 如果你在同一秒内开始多个工作(或者你的时间分辨率是什么),它们将从相同的种子开始。

从C标准(C ++基于这些兼容性功能):

  

srand函数使用该参数作为后续调用rand返回的新伪随机数序列的种子。如果随后使用相同的种子值调用srand,则应重复伪随机数序列。如果在对srand进行任何调用之前调用rand,则应该生成相同的序列,就像第一次使用种子值1调用srand时一样。

答案 1 :(得分:1)

你需要种子随机发生器。请在开头致电srand()

答案 2 :(得分:1)

要添加其他人的答案,您可以使用Mersenne Twister算法,它是C ++ 11库的一部分。它很快成为许多常用软件的标准,用于生成随机数。

例如,这是我写的函数,我常用它来生成其他代码中的随机数:

 std::vector<double> mersennetwister(const int& My,const int& Mz,
 const int& Ny,const int& Nz)
 {
 int ysize = (My + 2*Ny + 1);
 int zsize = (Mz + 2*Nz + 1);
 int matsize = ysize*zsize;
 unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
 // Seeding the generator with the system time
 std::mt19937_64 generator (seed);
 // Calling the Mersenne-Twister Generator in C++11
 std::uniform_real_distribution<double> distribution(0,1);
 // Specifying the type of distribution you want
 std::vector<double>  randarray(matsize,0);
 // Saving random numbers to an array
 for (int i=0;i<matsize;++i)
 {
    randarray[i] = distribution(generator); // Generates random numbers fitting the 
    // Distribution specified earlier
 }
 return(randarray);
 } 

底线:C ++ 11具有一些用于数值运算的出色功能,最好对它们进行研究。至于Mersenne Twister,http://en.wikipedia.org/wiki/Mersenne_twister