▚ 01 简介
- 随机数在概率算法设计中是必须的。在计算机上无法产生真正的随机数,一般使用伪随机数发生器产生的伪随机数。
- 伪随机数发生器是一个算法,产生的数列元素之间近似相互独立,多数力图产生的样本同分布。
- 常用的伪随机数发生器:线性同余发生器、滞后
Fibonacci
发生器、线性反馈移位发生器、广义反馈移位发生器等。 - 线性同余发生器:线性同余法产生的随机序列 a1,a2,……,an,满足
1、a0=d; 其中d称为种子
2、an=(b*a(n-1)+c) mod m,n=1,2,……,b ≥ \geq ≥ 0, c ≥ \geq ≥ 0, d ≥ \geq ≥ m 。
▚ 02 线性同余发生器的示例
✨
C语言
编写,可复制粘贴后,直接运行
。
源码为:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber
{
private:
unsigned long randSeed;
public:
RandomNumber(unsigned long s = 0); //构造函数
unsigned short randomInteger(unsigned long n); //产生0--n-1之间的随机整数
double randomFloat(void); //产生[0,1)之间的随机实数
};
RandomNumber::RandomNumber(unsigned long s)
{
if (s == 0)
{ //用系统时间产生种子
time_t tm = time(NULL); //获取系统时间
srand((unsigned int)tm); //用来设置rand()产生随机数时的随机种子
randSeed = rand(); //产生一个随机数值
}
else
{ //由用户定义随机数值
randSeed = s;
}
}
/*
产生0--n-1之间的随机整数,用线性同余计算的新种子高16位随机性好,将其右移16位
*/
unsigned short RandomNumber::randomInteger(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}
/*
产生[0,1)之间的随机实数
*/
double RandomNumber::randomFloat(void)
{
return randomInteger(maxshort) / double(maxshort);
}
int main()
{
printf("\n************************\n请输入一个种子:");
unsigned long rs;
scanf("%ld", &rs);
RandomNumber rn(rs);
printf("\n请输入一个整数(确定随机数的范围):");
int n;
scanf("%d", &n);
printf("\n\n************************\n产生0--%d之间的随机整数:%u \n", n - 1, rn.randomInteger(n));
printf("\n产生[0,1)之间的随机实数为:%lf\n\n\n\n", rn.randomFloat());
return 0;
}
运行结果为: