2017-06-16 154 views
1

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

我已经找到对此问题的参考文献>here<>here<>here<

但我仍然有这样的感觉,即如果N很小,参考文献中提到的方法就可以工作。即将所有数字从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; 
} 

我知道这是不是一个很好的随机数量,但它会是足够的还是会给某些算法带来问题?

+0

因此,您的整个问题只是您的'longrand'功能是否正常?你不是在问如何组织大量的数字并确保它们是唯一的? –

+3

面临同样的问题,即C运行时rand和qrand都不能生成质量随机集。这是自C++ 11以来用现代C++处理的。没有额外的框架需要:https://stackoverflow.com/questions/14009637/c11-random-numbers – AlexanderVX

+0

@大卫:不,我想问两个。首先,有没有2^64标志运行O(M)的方法?其次,我的longrand()对于这种方法工作是否足够好,还是会产生问题? –

回答

0

2^64-1是一个64位数字。 DES使用64位块大小。使用固定密钥,在ECB模式下使用DES对数字0,1,2,3,4 ...进行加密,以获得所需数量的数字。由于输入是唯一的,而且密钥是固定的,所以64位输出也是唯一的。

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

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

我假设您可以从Qt运行C++ DES实现。