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;
}
调试输出: