随机数模拟抛硬币实验

在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数。线性同余法是产生伪随机数最常用的方法(这里不介绍)。


下面用计算机产生大的伪随机数来模拟抛硬币试验。假设抛10次硬币,每次抛硬币得到正面和反面是随机的。抛10次硬币构成一个事件。调用Random(2)返回一个二值结果。返回0表示抛硬币得到反面,返回1表示得到正面。下面的算法TossCoins模拟抛10次硬币这一事件。在主程序中反复用函数TossCoins模拟抛10次硬币这一事件50000次。用head[i](0<=i<=10)记录这50000次模拟恰好得到i次正面的次数。最终输出模拟抛硬币时间得到正面事件的频率图。

#include
#include
#include 
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); //产生0到n-1之间的随机数
		double fRandom(void); //产生[0,1)之间的随机数
};

RandomNumber::RandomNumber(unsigned long s)  //产生种子
{
	if(s==0)
		randSeed=time(0);  //用系统时间产生种子
	else
		randSeed=s;  //由用户提供种子
}

unsigned short RandomNumber::Random(unsigned long n) //产生0到n-1之间的随机整数
{
	randSeed=multiplier*randSeed+adder;
	return(unsigned short)((randSeed>>16)%n);
}

double RandomNumber::fRandom(void)   //产生[0,1)之间的随机数
{
	return Random(maxshort)/double(maxshort);
}



int TossCoins(int numberCoins)
{
	//随机抛硬币
	static RandomNumber coinToss;
	int i,tosses=0;
	for(i=0;i


你可能感兴趣的:(算法初步)