仔细研究了下种子的问题,确实是重中之重,一顿折腾之后我在VC++6.0里实现如下:
BYTE m;
WORD i, crc16;
DWORD rand_data[4], dwBuf0, dwBuf1, dwBuf2;
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
i = sysTime.wYear +
sysTime.wMonth +
sysTime.wDay +
sysTime.wDayOfWeek +
sysTime.wHour +
sysTime.wMinute +
sysTime.wSecond +
sysTime.wMilliseconds;
dwBuf0 = ~i;
dwBuf0 <<= 16;
dwBuf0 += i;
for(m=0; m<4; m++)
{
//循环右移5位后的数据作为下一个随机数的种子
dwBuf1 = dwBuf0 << 27;
dwBuf1 &= 0xfe000000;
dwBuf2 = dwBuf0 >> 5;
dwBuf2 &= 0x01ffffff;
dwBuf0 = dwBuf1 + dwBuf2;
dwBuf0 = ~dwBuf0;
dwBuf0 ^= 0xxxxxxxxx;
srand(dwBuf0);
rand_data[m] = rand();
}
你觉得这个效果如何?
|