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;
}

调试输出:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值