c++ - Qt:大量独特的随机 quint64

标签 c++ qt random

我有以下情况:我想生成 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/

相关文章:

c++ - Google Sparsehash 在不可平凡复制的类型上使用 realloc()

python - PySide Signal 无法重载 Python 类

java - 如何在不接收重复项的情况下随机化一定数量的枚举值?

c# - 用于 C# 的 Quantlib 64 位?

c# - 如何编写用于将 Qt 信号映射到 C# 事件的包装类(通过 C++/CLI)

c++ - Qt 工具提示在显示时将窗口置于最前面

java - Android 卡牌游戏 Random()

python - 随机 Python 字典键,按值加权

c++ - 从没有内置类型的 C++ 调用 Cython

c++ - fatal error : qapplication. h:没有那个文件或目录