随机抛硬币
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; }
相关文章推荐
- Unity 5.x BuildAssetBundles 角色换装 基础使用
- jsp表单的客户端验证
- APUE学习之----进程通信fifo实现管道
- CSS检测的高像素密度屏幕设备
- 平常心
- 关于浏览器内核的认知
- java中对集合对象list的几种循环访问
- JAVA 十进制转十六进制(蓝桥杯
- 【转】App开发者必备的运营、原型、UI设计工具整理
- 几何之距离---两个平面和直线的距离求法
- 国的外贸公司如何应对金融风险
- log4j重定向stdout和stderr到log文件
- POJ-3006
- Magento系统中应用的12种设计模式
- 位域操作的函数封装
- zabbix
- 夺命雷公狗---PHP---玩转安卓2之扫码进行登录原理
- C++ string 陷阱—— append() 与相加
- 后台商品栏目空白
- 在论坛中出现各种疑难问题: MSSQL 导入导出的时候提示 无法检索源数据和目标数据的列信息