2013-05-06 86 views
4

我有麻烦试图生成一个随机的无符号__int64值,没有任何人有做这样的事情的一种快速有效的方法是什么?下面是我正在做的,请检查下面的代码。如何创建一个随机bit64值

unsigned __int64 m_RandomKey = 0; 

while(m_RandomKey == 0) 
{ 
    m_RandomKey = (unsigned __int64) rand() << 32 | rand(); 
} 

什么是产生一个无符号__int64键,以便为正在努力一段时间后再次获得相同的钥匙,甚至在所有的最好方法? 它不一定是唯一的只要在18,446,744,073,709,551,615中还有1个,它就不会再执行一次!

+0

可能是有益的:http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution – chris 2013-05-06 20:31:53

+1

'不需要rand'以生成32位的值。它生成范围为[[0,RAND_MAX]'的值,并且'RAND_MAX'必须> = 32767。稍微复杂的算法可以对此进行调整。 – 2013-05-06 21:10:41

回答

0

我认为你的方法是快速,便携和足够好。只要你初始化随机种子,这应该工作得很好。兰德()可能不是一个完美的均匀分布,但它非常接近。

由于@Pete提到兰特()是唯一可以肯定的跨越一个16位数工作,所以一个稍微复杂的表达可能是真正的便携性更好如下: m_RandomKey =(无符号__int64)((RAND()< < 48)|(RAND()< < 32)|(RAND()< < 16)|兰特());

仍然快速,绝对更好。

+1

但该算法假定'rand'生成一个32位值,这是不能保证的。 16位是必需的最小值。 – 2013-05-06 21:11:27

+0

@Pete - 你是对的,已经编辑了我的答案 – Elemental 2013-05-07 08:31:54

+0

尽管如此,还是不​​对的。如果“int”小于48位,则新版本具有未定义的行为。向'unsigned __int64'添加一个强制类型转换为'rand'的每个调用的返回值将会解决这个问题,但是如果RAND_MAX大于2^16 - 1,它会浪费比特。我并没有试图挑选你,只是指出编写好的随机数生成器并不简单。 Knuth尝试了一种看似合理的方式:使用随机数发生器随机选取八个中的一个(如果我没记错的话)不同的发生器以产生下一个值;原来这太可怕了。 – 2013-05-07 11:47:43