Qt:大量独特的随机quint64

时间:2017-06-16 04:45:07

标签: c++ qt random

我有以下情况:我想在10 16 和2 64 -1之间生成M = 500,000个唯一随机数。为了简化这种情况,我们可以假设我们需要一个介于1和N = 2 64 -1之间的数字。

我已经找到了对此问题>here<>here<以及>here<的引用。

但是我仍然有这样的感觉,即如果N小得多,参考文献中提到的方法也能起作用。即不能选择从1到N的所有数字的列表,混合它们并取第一个M.并且我认为应该有比尝试和错误更有效的方法,因为M&lt;&lt; N.和M&lt;总是给出N.因此,如果N-M小或甚至N = M,则算法不好。但不知何故,大N给了我头疼......

与此问题相关,我尝试扩展qrand()以获得随机的`quint64 with

quint64 MainWindow::longrand()
{
    quint64 erg=(quint64)qrand();
    for(int i=0;i<4;i++)
        erg=(erg<<(RAND_MAX+1))+qrand();
    erg=(erg<<16)+(qrand()%16);
    return erg;
}

我知道这不是一个非常好的随机数,但它是否足够或者这会给某些算法带来问题?

1 个答案:

答案 0 :(得分:0)

2 ^ 64-1是64位数。 DES使用64位块大小。使用固定密钥,在ECB模式下使用DES加密数字0,1,2,3,4 ......以获取所需数量的数字。由于输入是唯一的并且密钥是固定的,因此64位输出也保证是唯一的。

如果64位数字是&lt; 10 ^ 16只是拒绝它并继续下一个输入整数。这将在每1,800个数字中发生大约1个(2 ^ 64/10 ^ 16)。

如果您记录了密钥和最后使用的号码,您可以根据需要在列表中添加更多号码。

我假设有一个可以从Qt运行的C ++ DES实现。