在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数。线性同余法是产生伪随机数最常用的方法(这里不介绍)。
下面用计算机产生大的伪随机数来模拟抛硬币试验。假设抛10次硬币,每次抛硬币得到正面和反面是随机的。抛10次硬币构成一个事件。调用Random(2)返回一个二值结果。返回0表示抛硬币得到反面,返回1表示得到正面。下面的算法TossCoins模拟抛10次硬币这一事件。在主程序中反复用函数TossCoins模拟抛10次硬币这一事件50000次。用head[i](0<=i<=10)记录这50000次模拟恰好得到i次正面的次数。最终输出模拟抛硬币时间得到正面事件的频率图。
#include<iostream>
#include<time.h>
#include <iomanip>
using namespace std;
//随机数类
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); //构造函数,默认值0表示由系统自动生成种子
unsigned short Random(unsigned long n);