我在尝试生成随机无符号__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中有一个机会再没有这样做了!
答案 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());
仍然很快,绝对更好。