C++抽象编程——接口总结——随机库代码

我们通过学习random.cpp的代码,主要目标不是为了掌握所有其的复杂性。我们希望做的是知道为什么作为random.h的客户不要了解所有这些细节。 random.cpp中的代码是微妙的,并且包含许多潜在的陷阱,这些陷阱可能会阻碍那些试图从头开始实现这些功能的随意程序员。库接口的主要目的是隐藏这种复杂性。
举个例子,墙可以保护客户免受中世纪地图上可能被标记为“Here Be Dragons”的各种各样的危险。 这些危险如下图所示,其中界面墙将查尔斯·古尔德的“神话怪物”(1886年)的航海龙与Thomas More的乌托邦(1516)分开:

所以,就是说让客户操作那些实现,就会产生很多意想不到的错误,为了避免这些错误,我们就尽量的不让用户接触那些实现。所以我们设置了一堵墙来隔离用户与实现(所以我们用两个不同的cpp文件,一个为实现,一个为我们的main函数)。但是隔离了我们就不能运用那些函数了,所以我们要有一个接口来提供用户提取函数(就类似墙里有一条缺口)。上图就是为了说明这个道理。
下面就是这次我们学习的接口函数与实现文件:

random.h

知识点参考:
C++抽象编程——接口(4)——随机接口的设计

#ifndef _random_h
#define _random_h

/*
* 函数: randomInteger
* 用法: int n = randomInteger(low, high);
* ----------------------------------------
* 返回一个范围为 low到high之间的一个整数.
*/
int randomInteger(int low, int high);
/*
* 函数: randomReal 
* 用法: double d = randomReal(low, high);
* ----------------------------------------
* 返回一个范围为 low到high之间的一个实数(不包括high).
*/
double randomReal(double low, double high);
/*
* 函数: randomChance(p); 
* 用法: if (randomChance(p));
* ----------------------------------------
* 以p表示返回true的概率。 参数p必须是0和1(始终)之间的浮点数。 
*例如,调用randomChance(.30)返回true的概率为30%
*/
bool randomChance(double p);
/*
* 函数: setRandomSeed
* 用法: setRandomSeed(seed);
* ---------------------------
* 将内部随机数种子设置为指定值。 
* 你可以使用此功能设置伪随机序列的特定起始点,
* 确保程序行为在调试阶段可重复.
*/
void setRandomSeed(int seed);
/*
* 函数: initRandomSeed
* 用法: initRandomSeed();
* ---------------------------
* 初始化随机种子 
* 如果没有被初始化,执行初始化 
* 只是初始化一次.
*/
void initRandomSeed(); 

#endif 

random.cpp

实现过程参考:
C++抽象编程——接口(5)——随机数算法
C++抽象编程——接口(6)——设置随机数种子

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime> //time function
#include "random.h"
using namespace std;
int randomInteger(int low, int high){
    initRandomSeed();
    double d = rand() / (double(RAND_MAX) + 1);
    double s = d * (double(high) - low + 1);
    return int(floor(low + s));
}
double randomReal(double low, double high){
    initRandomSeed();
    double d = rand() / (double(RAND_MAX) + 1);
    double s = d * (double(high) - low);
    return low + s;
}
bool randomChance(double p){
    initRandomSeed();
    return randomReal(0, 1) < p;
}
void initRandomSeed(){
    static bool initialized = false;
    if(!initialized) {
        srand(int(time(NULL)));
        initialized = true;
    }
}
void setRandomSeed(int seed){
    initRandomSeed();
    srand(seed);
}

测试用例

参考 C++抽象编程——接口(5)——随机数算法 中的Craps.cpp文件,将.h文件,.cpp文件,换成上面的再次运行,结果就每次都不同。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值