4

我在尝试生成随机无符号 __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 分之一的机会不再这样做!

4

2 回答 2

7

如果您使用的是 C++11,则可以使用std::mt19937_64Mersenne 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 ) 中可用。

于 2013-05-06T20:32:03.647 回答
0

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

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

仍然很快,而且肯定更好。

于 2013-05-06T20:39:48.253 回答