1. 程式人生 > >C++ 生成一個64位的隨機數

C++ 生成一個64位的隨機數

64位最大數:FFFF FFFF FFFF FFFF

思路:每8位生成一個隨機數,通過迴圈移位,相與,合成一個64位數。

#include "stdafx.h"
#include "stdlib.h"
#include <time.h>
#include <stdlib.h>

__int64 Rand64(__int64 nMax)
{
	__int64 nRandData = 0;
	
	for(int i=0;i<8;i++)
	{
		__int64 nMask = 0xFF;
		nMask = nMask<<(i*8);
		int bData = ((nMax & nMask)>>(i*8)) & 0xFF;
		if(bData > 0)
		{
			__int64 nData = rand()%bData;
			nRandData |= nData<<(i*8);
			printf("Max:%I64X Mask:%I64X BYTE:%X rand:%X randData:%I64X\n",
				nMax, nMask, bData, (int)nData, nRandData);
		}
	}
	return nRandData;
}

int main(int argc, _TCHAR* argv[])
{
	srand(time(0));
	Rand64(9223999036854775807);
	system("pause");
	return 0;
}

上面那種方法對0x100000,0xFF000,0x700800之類的數,會很難隨機。

改進方法:將每8位儲存起來,遍歷陣列,如果遇到0x00,則向高位借位,將此為置為0xFF,如果沒有高位,則不借位。

__int64 CHelloWorldDlg::rand64(__int64 nMax)
{
	// 分解
	BYTE aBuf[8] = { 0 };
	for(int i=0;i<8;i++)
	{
		aBuf[i] = (nMax>>8*i) & 0xFF;
	}
	for(int i=7;i>=0;i--)
	{
		TRACE("%02x ",aBuf[i]);
	}
	TRACE("\n");
	// 填充x00的資料為xFF,高位減
	for(int i=0;i<8;i++)
	{
		if(aBuf[i] == 0)
		{
			for(int j = i+1;j<8;j++)
			{
				if(aBuf[j] != 0)
				{
					aBuf[j] -= 1;
					for(int k=i;k<j;k++)
					{
						aBuf[k] = 0xFF;
					}
					i = j;
					break;
				}
			}
		}
	}
	for(int i=7;i>=0;i--)
	{
		TRACE("%02X ",aBuf[i]);
	}
	TRACE("\n");
	// 生成隨機數併合並
	__int64 nData = 0;
	for(int i = 0; i < 8; i ++)
	{
		if(aBuf[i] > 0)
		{
			__int64 bRand = rand()%(aBuf[i]+1);
			__int64 nRand = bRand<<8*i;
			nData |= nRand;
			TRACE("rand:%02I64X rand64:%I64X data:%I64X\n",bRand, nRand, nData);
		}
	}
	TRACE("\n");
	return nData;
}

除錯輸出: