#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;
}
随机抛硬币
最新推荐文章于 2023-09-30 20:19:03 发布