我有以下情况:我想生成 M=500,000 个介于 1016 和 264-1 之间的唯一随机数。为了简化情况,我们可以假设,我们需要一个介于 1 和 N=264-1 之间的数字。
我已经找到对这个问题的引用 >here<和 >here<和 >here< .
但我仍然觉得,如果 N 小得多,引用资料中提到的方法就可以工作。 IE。无法列出从 1 到 N 的所有数字,将它们混合并取第一个 M。不知何故,我认为应该有比尝试错误更有效的方法,因为 M<< N。而且 M << N 总是给出。因此,如果 N-M 很小甚至 N=M,则算法不一定好。但不知何故,大 N 让我头疼......
与此问题相关,我尝试扩展 qrand() 以获得随机的 quint64
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;
}
我知道这不是一个很好的随机数,但它是否足够,或者这会给某些算法带来问题吗?
最佳答案
2^64-1 是一个 64 位数字。 DES 使用 64 位 block 大小。使用固定 key ,在 ECB 模式下使用 DES 加密数字 0、1、2、3、4 ...,以获得所需数量的数字。因为输入是唯一的并且 key 是固定的,所以 64 位输出也保证是唯一的。
如果 64 位数字 < 10^16 则拒绝它并继续下一个输入整数。每 1,800 个数字 (2^64/10^16) 中大约会有 1 个发生这种情况。
如果您记录了 key 和最后使用的号码,您可以根据需要向列表中添加更多号码。
我假设有一个可以从 Qt 运行的 C++ DES 实现。
关于c++ - Qt:大量独特的随机 quint64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44580984/