您的位置:首页 > 其它

随机抛硬币

2015-12-11 13:10 232 查看
#include "iostream"
#include "ctime"
#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);  //产生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);  //高16位随机性较好,右移16位后,映射到(0~n-1)范围内
}

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

int TossCoins(int numberCoins)  //随机抛硬币,numberCoins为抛掷次数,返回硬币正面朝上的次数
{
static RandomNumber coinToss;
int i, tosses = 0;   //硬币正面朝上的次数
for(i=0; i<numberCoins; i++)
tosses += coinToss.Random(2);  //Random(2)表示正面
return tosses;
}

//模拟随机抛硬币事件
int main()
{
const int NCOINS = 10;      //频率
const long NTOSSES = 50000L;   //模拟事件次数
long i, heads[NCOINS+1];  //heads[i]是得到i次正面的次数
int j, position;
for(j=0; j<=NCOINS; j++)  //初始化heads
heads[j] = 0;
for(i=0; i<=NTOSSES; i++)  //重复50000次事件
heads[TossCoins(NCOINS)]++;
for(i=0; i<=NCOINS; i++)   //输出频率图
{
position = int(float(heads[i])/NTOSSES*72);
cout<< setw(6) << i << " ";
for(j=0; j<position-1; j++)
cout<< " ";
cout<<"*"<<endl;
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: