使用qrand()和qsrand()的唯一随机数序列

时间:2009-07-29 16:59:10

标签: qt random

我想在QT中生成唯一的随机数序列,使用QDateTime :: currentDateTime()。toTime_t()作为种子值,qrand()会生成唯一的随机数吗?

3 个答案:

答案 0 :(得分:8)

没有。 qrand只能生成与整数相同的唯一数字,因此 - 无论实现如何 - 您都不能指望唯一性。

此外,知道不同的种子会创建不同的随机整数会产生一定程度的可预测性,从而有效地使qrand不再随机。

编辑:我发誓,我不是想通过张贴卡通来取笑你;我认为这是对这个问题的一个很好的解释:

alt text
(来源:dilbert.com

答案 1 :(得分:6)

根据您存储会话ID的方式,您可以使用UUID生成(大部分)保证唯一标识符。请参阅QUuid的文档。还要注意这一点(粗体添加):

  

您也可以使用createUuid()createUuid()生成的UUID是随机类型。他们的QUuid::Version位设置为QUuid::Random,其QUuid::Variant位设置为QUuid::DCE。 UUID的其余部分由随机数组成。 从理论上讲,这意味着createUuid()生成的UUID很可能不会是唯一的。但这是一个非常小的机会。

我可以保证这些生成的UUID不一定是唯一的,所以如果你确实需要它们是唯一的,请查看libuuid或类似的东西。

答案 2 :(得分:0)

根据Qt Documentation,QRand只是标准rand()的线程安全版本,我不认为使用的方法比rand()更安全/更优越描述

我认为您需要使用与“唯一”随机数不同的术语(没有Psuedo-Random Number Generator会生成唯一流,因为输入X将总是生成输出Y)。什么是实际情况?