我有以下情况:我想在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;
}
我知道这不是一个非常好的随机数,但它是否足够或者这会给某些算法带来问题?
答案 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实现。