作者:朱金灿

 

   随机数生成的应用场合很广,比如生成验证码、生成GUID、彩票,随机选择等等。今天从一个哥们学到了一个跨平台随机数生成函数,据说不重复率可以达到99.9%。不说废话,直接上代码:

unsigned int GetRandom()
{
int nNum = 0;
#ifdef _MSC_VER
#if defined _WIN32_WCE
CeGenRandom(sizeof(nNum), (PBYTE)&nNum);
#else
HMODULE hLib = LoadLibraryA("ADVAPI32.DLL");
if (hLib)
{
BOOLEAN (APIENTRY *pfn)(void*, ULONG) =
(BOOLEAN (APIENTRY *)(void*,ULONG))GetProcAddress(hLib,"SystemFunction036");
if (pfn) {
ULONG ulCbBuff = sizeof(nNum);
if(pfn(&nNum,ulCbBuff))
{
}
}
FreeLibrary(hLib);
}
#endif

#elif defined __APPLE__ || defined __IOS__
return arc4random();
#elif defined __GNUC__
int fd = open("/dev/urandom", O_RDONLY);
if (fd != -1)
{
(void) read(fd, (void *) &nNum, sizeof(int));
(void) close(fd);
}

#endif

//最后的处理,苹果系统不需要
#if !defined(__APPLE__) && !defined(__IOS__)
return (unsigned int)((long long)nNum + (long long)INT_MAX + 1);
#endif
}

int _tmain(int argc, _TCHAR* argv[])
{

for (int i = 0;i<50;i++)
{
printf("%u\n",GetRandom());
}

getchar();

return 0;
}


  可以看到在Windows平台下貌似用到了一个非公开的Windows API函数SystemFunction036。