当前课程知识点:基于Linux的C++ > 第五讲 程序组织与开发方法 > 5.4 随机数库(二) > LinuxCPP0504
下面我们给大家展示
随机数库该怎么设计
在目录下边创建一个新的目录 叫Random
进入Random目录
我们在gedit下面New了一个文件
然后Save 保存它
选到Random这个目录下
把它保存成“zyrandom.cpp”
再New一个
把它保存成“zyrandom.h”
再New一个(需要三个文件)
把它保存成“main.cpp”
我们要测试这个random库
对于random这个库
我们实际上提供了三个函数
一个是随机化的函数
一个是生成随机整数
一个是生成随机的实数
就这三个函数
zyrandom这个头文件要完成
三个函数原型的设计
Randomize是一个
随机化一个 然后int
GenerateRandomNumber( int low, int high)
生成随机整数一个
然后生成随机实数一个
这个就是zyrandom随机数库的接口
三个函数 我们实现它
实现的时候呢
肯定是需要“iostream”的
因为万一有个错误的话要输出的
然后还需要包含
“ctime”头文件(C的时间库)
因为我们用它做随机数发生器的种子
然后void Randomize
随机化函数 srand函数
(int)time(0)
用当前的时间作为随机数发生器的种子
因为srand函数实际上是在
“cstdlib”这个头文件里
所以要包含它
接下来生成
GenerateRandomNumber(int low, int high)
定义一个量double
if( low>high)
如果low是大于high
那说明它有问题
所以我们就输出cout
<< ”GenerateRandomNumber: Make sure low <= high/\n”
退出
否则就把生成的随机数转换成double
然后把RAND_MAX转化成double加上1.0
去除 得到这个随机数
在0、RAND_MAX之间的比例
然后把这个比例再映射到[low,high]区间
return low + (int)(_d + high – low + 1)
搞错了 得乘
_d就是一个比例 乘上high – low + 1
就这么一个空间 映射过去
_d一乘 然后转换成整数加上low
然后double GenerateRandomReal( double low, double high)
一开始的代码是一样的
拷贝过来
保存一下
这个就直接除以RAND_MAX就行
因为实数比
然后low +_d * (high - low)就OK了
实数是无限多个 所以不需要那么费劲
也不需要转换成int
就是low加上这个比例
这个就是zyrandom
现在就要写一个程序来测试它
#include
#include “zyrandom”
包含这个头文件
注意这个标准库头文件
是使用尖括号包含
我们自己的头文件
应该是使用双引号包含
写一个main函数
定义一个int i 随机化
然后写一个for循环
i = 0;i < 8;i++
GenerateRandomNumber
随机生成10到99之间的数
初始化给t值
然后cout << t << “; ”
然后分号
写了一个for循环
生成八个随机整数
cout << endl
换行 再来 生成八个随机实数
保存 回到控制台
g++编译main.cpp
注意 因为“main.cpp”
需要使用zyrandom这个库
所以想编译“main.cpp”
当然要保证zyrandom同时也被编译
也就说还要编译“zyrandom.cpp”
好多错误
“main.cpp”
12行 错误在这
没有使用名空间
有名空间才行啊
再编译 还有错 19行警告
拷贝过来的 不对
double d 输出d
这是个浮点数 跟那个是两回事
继续
然后看“zyrandom.cpp”
这里面肯定也有问题
请看“zyrandom.cpp”第15行
cout那当然也是忘了 using namespace std
当然还是忘了名空间
把名空间放进去就对了
ls 出来结果了 我运行a.out
看看生成的几个整数
78、15、93、81、26、24、45、14
看上去蛮随机的
后边46.3459、14.2346也蛮随机的
这个就是我们的例子
同学们看到这一点就知道
我们真实写程序的时候
出现错误是非常非常正常的一件事情
要根据它显示错误的消息逐一去对照
我们通过这个例子给大家演示
我们这个错误出在哪
比如说 这个错误告诉你
是在“zyrandom.cpp”这个文件
第15行 告诉你是什么错误
“在这个作用域内cout无定义”
什么原因呢
就是因为我忘了写using namespace
那你要说我真不写using namespace
怎么办呢 cout就没定义吗
那么你就要用std这个名空间双冒号
去全局解析它
这个模式就ok了
这个也一样
按照这个模式去解析它也可以
我们重新编译它
没问题
对于“main.cpp”也一样
我习惯放在这后边
现在你看到
按照这样一个模式完成了一个库的设计
并且为这个库写了一个测试的代码
“main.cpp” 我测试了一下
看它运行的结果好像蛮随机的
我们的演示就到这里
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口