qrand没有生成随机数

时间:2010-06-29 06:36:26

标签: qt random

我有一个QT应用程序,再运行2个帖子。

在线程内部,我使用qrand函数生成一个随机数。以下是用于获取数字的代码,其中m_fluctuations max是double。

int fluctuate =  qrand() % (int)(m_FluctuationMax * 100);

我尝试在主线程中添加以下代码,也在线程类中添加。

QTime now = QTime::currentTime();
qsrand(now.msec());

现在的问题是,每次启动应用程序时,生成的值总是相同的。

它们不应该不同,因为种子是由'currentTime()'设置的。

由于

4 个答案:

答案 0 :(得分:8)

我在线程/类构造函数中有我的qsrand()。当我将它移动到run()函数时,它开始随机工作。不知道为什么它不能从构造函数中工作。谢谢大家的帮助。

答案 1 :(得分:4)

这可能会帮助碰巧遇到类似问题的人:

qsrand(static_cast<quint64>(QTime::currentTime().msecsSinceStartOfDay()));

array<int, 5> arr = {qrand(), qrand(), qrand(), qrand(), qrand()};

for(auto i : arr)
   cout << i << endl;

答案 2 :(得分:2)

我要检查的第一个now.msec()的值。它只返回当前时间的毫秒部分和doco状态:

  

请注意,准确性取决于底层操作系统的准确性;并非所有系统都能提供1毫秒的精度。

您的平台可能会始终为msec()返回相同的值。如果是这种情况,您可以尝试以某种方式使用分钟和秒组合(假设您没有每秒多次运行代码)。

您尚未说明您正在运行哪个平台,但如果设置了Q_OS_WINQ_OS_UNIX,则Qt源代码仅支持亚秒级分辨率。


请记住,随机数是每个线程的,所以您应该在每个线程中执行qsrand,以免它自动播种为1.

答案 3 :(得分:2)

  

我在线程/类构造函数中有我的qsrand()。当我将它移动到run()函数时,它开始随机工作。不知道为什么它不能从构造函数中工作。

qsrand()使用线程本地存储来存储种子,该种子实际上是伪随机数生成器状态,在每次调用qrand()时也会更新。如果您在将要使用它的线程之外播种PRNG,那么该种子不会影响结果。线程局部存储通常默认为零,这样每次都可以得到相同的伪序列,因为种子总是相同的。