在浏览了一段时间的问题并在谷歌上搜索了一堆之后,我发现自己很痛苦,因为没有一个“随机”生成器是真正随机的,我所说的随机是什么意思?总随机性,我在编译它们并运行多次打印大量值后发现的所有算法,结果是相同的,或者至少可以找到一种模式。这很糟糕,我正在为 MMO 服务器做一个随机数生成器,其功能将从升级项目到将一组玩家分成团队,模式总是,总是不好,想象每次我重新启动程序时生成相同的数字顺序。我的想法是,获得随机数的最好方法是弄乱时间,你永远无法知道某事发生的确切时间,如果时间非常精确就更好了。
inline __int64 NanoTime()
{
struct { int low, high; } Nano;
__asm push EAX
__asm push EDX
__asm __emit 0fh __asm __emit 031h
__asm mov Nano.low, EAX
__asm mov Nano.high, EDX
__asm pop EDX
__asm pop EAX
return *(__int64 *)( &Nano );
}
static DWORD g_Prev = NanoTime();
__int64 xRandom( void )
{
__int64 Now = NanoTime() - g_Prev / 2;
CString strRand, strLast;
strRand.Format( "%I64d", Now );
strLast = strRand.GetAt( strRand.GetLength()-1 );
strLast += strRand.GetAt( strRand.GetLength()-2 );
return( atoi( strLast ) );
}
虽然文本很大,但问题很简单,我需要一个尽可能小的算法的实数生成器的方向,我的解决方案每秒被调用数十万次不是我想要的,它只是在这里提示我需要的方向。
我已经研究过boost
,比如不使用最低位顺序time(0)
等。但都有一个模式。