如何创建随机bit64值

时间:2013-05-06 20:27:04

标签: c++ visual-c++

我在尝试生成随机无符号__int64值时遇到问题,是否有人能够快速有效地执行此类操作?下面是我正在做的,检查下面的代码。

unsigned __int64 m_RandomKey = 0;

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

生成无符号__int64密钥的最佳方法是什么,以便在一段时间后甚至根本不能再次获得相同的密钥? 它不一定是唯一的只要18,446,744,073,709,551,615中有一个机会再没有这样做了!

2 个答案:

答案 0 :(得分:7)

如果您使用的是C ++ 11,则可以使用std::mt19937_64,这是Mersenne twister算法的原生64位实现。

请参阅http://en.cppreference.com/w/cpp/numeric/random

它在Visual C ++ 2010和2012(http://msdn.microsoft.com/en-us/library/ee462314(v=vs.100).aspx)中可用。

答案 1 :(得分:0)

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

正如@Pete在下面提到的那样,Rand()只能确保在16位数字上工作,因此稍微复杂的表达式可能更适合真正的可移植性:  m_RandomKey =(unsigned __int64)((rand()&lt;&lt; 48)|(rand()&lt;&lt; 32)|(rand()&lt;&lt; 16)| rand());

仍然很快,绝对更好。