高斯随机数发生程序

原创 2003年04月01日 09:03:00
 
附送16bits,32bits均匀随机数发生程序

程序只产生均值为0,方差为1的随机数,要产生均值为E,方差为D的随机数,只要
随机数*D+E就可以了。

高斯随机数程序还是带参数的,参数是用来描述正态分布的一个浮点数表。在执行
程序时,先生成这个表(只做一次),而后就可以任意多次地执行高斯随机数产生
程序了。
使用C是为了保证通用性,如果有人觉得麻烦,可以用C++做个类,把这些东西都封
装进去。
另外,如果有人有兴趣,也可以把它修改成任意形式分布的连续随机数产生程序,
修改非常简单,这里就不提示了。

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

高斯随机数发生程序

附送16bits,32bits均匀随机数发生程序 程序只产生均值为0,方差为1的随机数,要产生均值为E,方差为D的随机数,只要 随机数*D+E就可以了。 高斯随机数程序还是带参数的,参数是...
  • pizi0475
  • pizi0475
  • 2015年09月23日 21:57
  • 694

如何模拟高斯分布的随机数发生器?

在一些算法中,经常会用到随机数,最常用的随机数有两种,一是服从均匀分布的随机数,二是服从高斯分布(正态分布)的随机数。在标准C中并没有产生高斯分布的随机数发生器,只有服从均匀分布的随机数发生器rand...
  • LG1259156776
  • LG1259156776
  • 2015年07月21日 09:55
  • 5397

C++高斯分布随机数的产生

基于Box-Muller算法的高斯分布随机数产生方法     为了产生高斯分布随机数,有必要先讲讲均匀分布随机数的产生。本文正是采用Box-Muller算法实现高斯分布的,而要借助Box-Mulle...
  • dreamandxiaochouyu
  • dreamandxiaochouyu
  • 2015年04月29日 20:54
  • 4639

C/C++生成高斯分布随机数

产生正态分布或高斯分布的三种方法: 1. 运用中心极限定理(大数定理) 1 #include 2 #include 3 4 #define NSUM 25 5 6 double g...
  • niuniuyuh
  • niuniuyuh
  • 2017年04月08日 15:32
  • 1147

Boost库:多维变量联合高斯分布随机数(Multivariate Normal Distribution Boost)

多维变量联合高斯分布随机数生成方法     在概率分布中,变量之间的往往存在相关性,因而变量之间的概率分布往往是一种联合概率分布。现实生活中往往需要很多随机数,对于独立变量,其随机数生成往往...
  • mmmyqmmm
  • mmmyqmmm
  • 2016年08月28日 15:26
  • 1521

matlab生成二维服从高斯分布的数据

matlab生成二维服从高斯分布的数据 2015-12-30 21:31 1263人阅读 评论(0) 收藏 举报  分类: matlab(8)  由于实验需...
  • crcr
  • crcr
  • 2017年03月02日 21:56
  • 4080

小程序-随机数生成器

//Application.java package src; public class Application { public static void main(String[] args)...
  • Coder__CS
  • Coder__CS
  • 2016年04月21日 23:17
  • 4976

自己编写产生随机数函数--MATLAB实现

这学期选了《现代数字信号处理》这门课,全是信号的东东,本科完全没有接触过这个东东,听起来有点费劲,作业还是用matlab做,第一个作业就用到了随机数,本来matlab有自己带的产生随机数的函数,但是老...
  • qust_waiwai
  • qust_waiwai
  • 2013年12月25日 16:31
  • 4410

学习OpenCV2——产生随机数

本文详细介绍了OpenCV中随机数的用法
  • GDFSG
  • GDFSG
  • 2016年03月08日 21:03
  • 4772

【算法分析】随机数的生成:均匀分布、正态、泊松 、瑞利

不使用系统提供的随机数,利用其它算法产生。
  • hujingshuang
  • hujingshuang
  • 2015年11月06日 10:48
  • 2637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高斯随机数发生程序
举报原因:
原因补充:

(最多只允许输入30个字)