2014-01-11 74 views
0

我有一个for循环,里面我产生随机数并用time(msecs)播种它,但它不是随机产生的,我该怎么做来解决这个问题?在很短的时间间隔内产生大量的随机数(C++)

说明: 我知道为什么rand()不是随机生成它们的,我在寻求解决方案,并且我正在使用Qt创建器(如果有帮助的话)。

for(int j=0;j<5;j++){ 
     qsrand(QDateTime::currentDateTime().time().msec());//for every j itteratio i must 
     for(int i=1;i<s;i++){        //have new sequence and ret is 
     ret.push_back(rand()%s);       //vector i'm using Qt 
     }             //s=4 for now,but s=[1;50] 
     qDebug()<<"new sequence ..."; 
    } 

它生成 [2,1,1],[2,1,1],[2,1,1],[2,1,1],[2,1,1];

+5

你永远不会从机器上获得trully随机性。你也应该种一次,而不是每次迭代。 –

+0

你是什么意思,它不会随机生成它们?你的意思是它总是给你同样的数字序列?你的意思是它总是给你相同的号码?生成一个随机数所需的时间少于几毫秒,所以你可能在很多时间使用相同的数字播种(种子在循环之外!)。 – FuzzyBunnySlippers

+0

从您发布的代码中,我得出结论,问题是由于一个错误。 –

回答

0

取决于您的应用程序。 如果您需要生成无法猜测的安全随机数,那么您应该使用CSPRNG https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator。 对于这个purpouse有/ dev/urandom可用于unix克隆。

如果您需要随机数字进行模拟或类似的需要随机数字的地方,您应该使用高质量的超快速,随机和大型PRNG,称为mersenne twister。
它可以在C++ 11的标准库或boost中使用。 (仅标题)
http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
http://www.boost.org/doc/libs/1_55_0/doc/html/boost_random.html

正如许多其他说,请确保您的种子只有一次。

+0

我一定会检查他们 –

0

如果你想要一个很长的随机数序列,就像这里一样,那么你可能想要使用一个伪随机数生成器(除非这是用于加密!)。 C++ 11将随机和伪随机数支持到标准库中,这使得它非常易于使用。只需在循环之前用一个真正的随机数对PRNG进行种子处理,然后使用它的输出来获得(伪)随机数。您还需要包含random标题。

std::random_device rd; 
std::default_random_engine e1{rd()}; 
std::cout << e1(); // random number 
std::cout << e1(); // another random number 

std::uniform_int_distribution<> dist{1, 6}; 
std::cout << dist(e1); // random integer between 1 and 6 

如果这是密码学应用,请参阅Luka Rahne的说法。

相关问题