如何用C++编写一个随机发牌的程序?

 我来答
匿名用户
2013-08-08
展开全部
#include <memory.h>
#include <time.h>
#include <math.h>

#define GAUSS_TABLE_LENGTH 256

#include "random.h"

extern float Gauss_F[GAUSS_TABLE_LENGTH];
extern float Gauss_f[GAUSS_TABLE_LENGTH];
extern DWORD RandomKey,RandomKey32;

DWORD MCoef_32[2]={0xE7BD2160,0xDA3A2A9C};
WORD MCode_16[4]={0xD31C,0xC36C,0xD0A2,0xD228} ;
// two m sequence

#define INVALID_BLOCK 0xFFFF
#define BLOCK_SIZE 512

DWORD m_Seq_32(DWORD Key)
{
int i;
for(i=0;i<32;i++)
{
_asm
{
MOV EBX,Key;
SHL EBX,1
MOV EAX,Key;
MOV EDX,MCoef_32[0];
AND EAX,EDX; //select the bit for xor
MOV EDX,EAX;
SHR EAX,16;
XOR AX,DX;
XOR AH,AL; // because P only judge one byte
// so must XOR to judge the p of whole word
JP NEXT //jp equals the xor
INC EBX
NEXT: MOV Key,EBX;

}
}
return Key;
}

WORD RNG()
{
DWORD A,B;
_asm
{
_emit 0x0f
_emit 0x31
MOV A,EAX
MOV B,EDX
}

RandomKey = m_Seq_32(RandomKey^A^B);
return (WORD)RandomKey;
}

DWORD RNG32()
{
DWORD A,B;
_asm
{
_emit 0x0f
_emit 0x31
MOV A,EAX
MOV B,EDX
}

RandomKey32 = m_Seq_32(RandomKey32^A^B);
return RandomKey32;
}

void NormalTable(float *FTable, float * fTable,int Length)
/*
生成正态分布函数和正态分布概率密度函数表,表宽度为3倍方差
正态分布函数均值为0,方差为1
FTable: 正态分布函数表
fTable: 正态分布概率密度表
Length: 表的长度
*/

{
int i;
float h; /* 步长 */
float x,temp;
float C;

x=-3;
h= 6.0/Length/2;
FTable[0]=0;
C=1/sqrt(2*3.1415927);
/* 初始参数设置 */

fTable[0]= exp(-x*x/2)*C;
/* 起始点的概率密度 ,exp(-x*x/2)*C为概率密度函数 */

for(i=1;i<Length;i++)
{
x+=h;
temp = exp(-x*x/2)*C;
x+=h;
fTable[i] = exp(-x*x/2)*C;
/* 计算正态分布概率密度函数 */

FTable[i] = FTable[i-1]+(fTable[i-1]+4*temp+fTable[i])*h/3;
/* 辛普森数值积分公式计算正态分布函数 */
}
}

float NormalRNG(float * Gauss_F, int Length)
/*
生成均值为0,方差为1的高斯随机数
Gauss_F: 正态分布函数表,规格如上,可以由NormalTable函数生成
Length: 正态分布函数表的长度
返回值:均值为0,方差为1的高斯分布随机数
*/

{
float RandomNumber;
float temp,h;
int i;

h= 6.0/Length;
/* 正态分布表的步长 */

temp = (float)RNG()/65536;
/*产生一个[0,1)区间内均匀随机数 */

if(temp == 0)
return 0;

for(i=0;i<Length;i++)
{
if(temp<=Gauss_F[i]) /*计算随机数落入正态分布表的哪个区间 */
{
RandomNumber = (-3+h*i)+(temp-Gauss_F[i-1])/(Gauss_F[i]-Gauss_F[i-1])*h;
/* 进行线性差值 */
break;
}
}
return RandomNumber;
}

//来自网络
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式