作业帮 > 综合 > 作业

用c语言模拟抛硬币的过程

来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/12 06:35:11
用c语言模拟抛硬币的过程
要输入抛硬币的次数,输出里要有数字面和印花面的次数,最后算出得到数字面和印花面的概率(如果很满意我会加分)
用c语言模拟抛硬币的过程
C++:
class Program
{
int neg = 0,pos = 0;
int turn = 0;
public Program(int turn)
{
this.turn = turn;
}
public void start()
{
Random rand = new Random();
for (int i = 0; i < turn; i++)
{
result(rand.Next(0,2));
}
}
public void result(int i)
{
if (i == 0)
neg++;//正面的次数
else if (i == 1)
pos++;//反面的次数
else
Console.WriteLine("error!");
}
public void print()
{
Console.WriteLine("抛硬币的次数:{0}",turn);
Console.WriteLine("正面出现的次数:{0}",neg);
Console.WriteLine("正面出现的概率:{0}%",neg * 100 / turn);
Console.WriteLine("反面出现的次数:{0}",pos);
Console.WriteLine("反面出现的概率:{0}%",pos * 100 / turn );
}
public void process()
{
int j;
Console.WriteLine("请输入1开始抛硬币");
j = Convert.ToInt32(Console.ReadLine());
if (j == 1)
{
Console.WriteLine("请输入抛硬币的次数:");
turn = Convert.ToInt32(Console.ReadLine());
start();
Console.WriteLine("输入数字2显示抛掷的结果:");
j = Convert.ToInt32(Console.ReadLine());
}
if (j == 2)
print();
}
static void Main(string[] args)
{
Program play = new Program(0);
play.process();
Console.Read();
}
}
C:
抛10次硬币构成一个事件,每次事件记录得到正面的个数.反复模拟这个事件50,000次,然后对这50,000L次进行输出频率图,比较每次事件得到正面次数的比例.
以下是总的代码:
头文件 RandomNumber.h:
代码
// RandomNumber.h
const unsigned long maxshort = 65535L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
#ifndef RANDOMNUMBER_H
#define RANDOMNUMBER_H
class RandomNumber{
private:
// 当前种子
unsigned long randSeed;
public:
// 构造函数,默认值0表示由系统自动产生种子
RandomNumber(unsigned long s = 0);
// 产生0 n-1之间的随机整数
unsigned short Random(unsigned long n);
// 产生[0,1) 之间的随机实数
double fRandom();
};
#endif
类实现文件RandomNumber.cpp :
代码
// RandomNumber.cpp
#include "RandomNumber.h"
#include
#include
#include
using namespace std;
// 产生种子
RandomNumber::RandomNumber(unsigned long s)
{
if(s == 0)
randSeed = time(0); //用系统时间产生种子
else
randSeed = s;
}
// 产生0 n-1 之间的随机整数
unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}
// 产生[0,1)之间的随机实数
double RandomNumber::fRandom()
{
return Random(maxshort) / double(maxshort);
}
主文件Main :
代码
// 主文件main
/*
* Author:Tanky woo
* Blog:www.WuTianQi.com
* Date:2010.12.7
* 代码来至《计算机算法设计与分析》
*/
#include "RandomNumber.h"
#include
#include
#include
using namespace std;
int TossCoins(int numberCoins)
{
// 随机抛硬币
static RandomNumber coinToss;
int i,tosses = 0;
for(i = 0; i < numberCoins; ++i)
tosses += coinToss.Random(2);
return tosses;
}
int main()
{
// 模拟随机抛硬币事件
const int NCOINS = 10;
const long NTOSSES = 50000L;
// heads[i]得到的i次正面的次数
long i,heads[NCOINS+1];
int j,position;
// 初始化数组heads
for(j = 0; j < NCOINS+1; ++j)
heads[j] = 0;
// 重复50,000次模拟事件
for(i = 0; i < NTOSSES; ++i)
heads[TossCoins(NCOINS)] ++;
// 输出频率图
for(i = 0; i