C++ 生成一個64位的隨機數
阿新 • • 發佈:2019-02-20
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; }
除錯輸出: