最近在整理《0bug-C/C++商用工程之道》一书的勘误表,对其中P199页的随机数描述,自己觉得不太满意,有点描述不清,因此做了一点修订。

2 获得0

如上所示,如果我们期待一个经过某种计算获得的绝对0值,也通常使用下面的方法产生。
inline int _Get0(void)
{
    int nRet=rand();
    return nRet^nRet;       //以异或方式求的0
}
       此处读者可能会觉得奇怪,我们明明可以以一个1带代表非零值,以0代表0值,为什么还要多此一举,做两个函数。
       这里笔者解释一下:做这两个函数的目的,主要是为了某些时候商用加密需求,全局收拢所有的非0值0值的服务请求,提供高强度加密的可能。比如我们看看如下段落:
for(i=0;i<n;i++){}
我们可以写为:
for(i=_Get(0);i<n;i++){}
又或者
while(1)
我们可以写为
while(_GetNot0())
此时,我们可以在这两个函数中,根据加密条件做一定的数学变幻,使之从绝对正确,变得部分不正确,由于这是几乎所有循环计算的基数产生器,并且使用inline做内联展开,我们可以瞬间将加密要点部署到程序的每个角落,起到软件保护的作用。
 
5.5.5.3 获得给定范围的随机数
其实C语言里面,已经针对随机数提供了大量的函数,本来已经可以很方便的调用。不过在工程实践中,笔者发现团队里很多程序员,居然很多时候用错了随机数,造成一些不该有的错误,因此,把随机数的获得函数,也做了标准化封装。(注意,nBegin和nEnd所限定的范围区间,不能大于编译器约定的随机数最大范围)
//获得给定区间内的随机数
inline int GetRandomBetween(int nBegin,int nEnd)
{
    int n=_GetNot0();           //获得一个随机数
    int nBetween=0;
    if(0>nBegin) nBegin=-nBegin;    //防御性设计防止Begin为负值
    if(0>nEnd) nEnd=-nEnd;      //防御性设计防止End为负值
    if(nBegin>nEnd)             //调整Begin和End的顺序,保证End>Begin
    {
        nBetween=nEnd;
        nEnd=nBegin;
        nBegin=nBetween;
    }
    else if(nBegin==nEnd)       //如果给定的Beggin和End相等,即范围为0
    {
        return nBegin;          //如果范围区间为0,直接返回
    }
    nBetween=nEnd-nBegin;       //求的区间  
    n=n%nBetween;               //通过求余运算限幅
    n+=nBegin;                  //与Begin累加,确保结果落于Begin和End之间
    return n;
}

本文转自tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/338233,如需转载请自行联系原作者

关于《0bug》一书随机数的一处修订相关推荐

  1. 《0bug-C/C++商用工程之道》首版勘误表

    接到出版社通知,<0bug-C/C++商用工程之道>第一版已告售罄,正准备第二次印刷,因此,我最近虽然工作很忙,也还是赶着把勘误表做出来,以便在第二次印刷时修订. 说来惭愧,本书虽然名为& ...

  2. 实际中常用的一个随机数产生器

    这是刚做完的一小段代码,经测试已经无误,呵呵,这里share给大家看看,有朋友觉得有用,可以拿去用. 这个程序解决的问题如下: 已知一件事物有几种状态,每种状态出现的概率不一样,要求做一个随机数产生器 ...

  3. 关于《0 bug -- C/C++商用工程之道》的一处bug

    这两天有很多朋友已经买了书了,并且开始看,呵呵,我心里也很高兴. 嗯,要说江湖上藏龙卧虎呢,这不,这才几天时间,已经有朋友指出我书中的一处明显错误,这里我正式给大家说明一下,免得对各位读者有个不好的误 ...

  4. 巧妙去除Word文档修订和批注帮助

    巧妙批量删除 去除Word文档修订和批注帮助 要除去修订和批注,您需要接受或拒绝更改,以及删除批注.这里就是方法: 1.在"视图"菜单上,指向"工具栏",然后单 ...

  5. java去除word修改痕迹_去除Word修订

    当你想让文档的读者看到的是文档的最终状态,而不是充满了删除线.下划线和边上的批注框,又或是格式错乱,总显示已删除的内容的文档,那么就需要去掉word文档的标记(含修订和批注). 注:为什么在" ...

  6. 怎么删除批注mysql_如何去掉 Word 文档修订和批注和不显示已删除内容

    你是否遇到过,打开文档的最终状态,而不是充满了删除线.下划线和边上的批注框,又或是格式错乱,总显示已删除的内容的文档,那么就需要去掉word文档的标记(含修订和批注). 注:为什么在"视图& ...

  7. 【181029】FreeEIM 飞鸽传书仿QQ即时通讯软件VC++源代码

    FreeEIM 仿QQ功能的企业即时通讯软件VC++的源代码,最后更新于2010年8月份,完成数据库更改的任务.将聊天记录改用数据库形式,暂且使用Access. 本软件的窗口和功能都与QQ有点相似,可 ...

  8. 大多数人没听过的FreeEIM飞鸽传书,超炫酷的仿QQ,九零后都爱玩

    FreeEIM 仿QQ功能的企业即时通讯软件VC++的源代码,最近又更新了一次,完成数据库更改的任务.将聊天记录改用数据库形式,暂且使用Access. 本软件的窗口和功能都与QQ有点相似,可发送文件. ...

  9. 一劳永逸去除Word文档修订和批注帮助(转)

    一劳永逸去除Word文档修订和批注帮助(转) 您从同事的电子邮件中收到一个文档,它对于您要制作的文档来说可能是一个很好的起点,于是您用新名称保存了它并按你的需要进行定制.您没有在意您的同事在原始文档中 ...

  10. 一劳永逸去除Word文档修订和批注帮助

    您从同事的电子邮件中收到一个文档,它对于您要制作的文档来说可能是一个很好的起点,于是您用新名称保存了它并按你的需要进行定制.您没有在意您的同事在原始文档中留的批注,因为在您的副本中没有看见它们.现在您 ...

最新文章

  1. LoadRunner的参数化功能分享
  2. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround
  3. 怎么打断点_搞笑段子: 有次相亲, 双方父母都在, 我坐下就给自己点了支烟
  4. qt 删除文件夹_Qt 贪吃蛇制作(含源码)
  5. 结构体相互嵌套使用的条件?
  6. UA MATH571A QE练习 R语言 多重共线性与岭回归
  7. c语言继续程序指令,C语言预处理程序
  8. CSS中的特殊的选择器
  9. LamBda学习(一)
  10. Java 字符编码与解码
  11. BZOJ1431 : MLand
  12. 工具学习——在线访问远程服务器的SSH工具
  13. 小散量化炒股记|Python也能量化财务指标!教你用净资产收益率选股!
  14. 油猴插件swagger复制路由等
  15. JDBC实现多条件查询万能解决思路
  16. 【IT科普】没有C语言之父,就没有乔布斯和Win10!
  17. 绘画板绘-小白画线不稳怎么办?
  18. python数字1 3怎么表示_python数字1-3
  19. Linux入门基本命令的使用。
  20. 1月初.wang域名总量15强:易名西数阿里云稳居三甲

热门文章

  1. matlab中 不是3和7倍数,从1到100的所有自然数中,不是3也不是7的倍数的数有多少个?...
  2. 虚拟服务器vdi重删,VDI桌面虚拟化简介
  3. 解决 Unit is masked
  4. 演练 京东注册页面的制作 1009 HTML
  5. 向往的生活之鸿蒙传承,《向往的生活5》播放量破6.43亿,张艺兴功劳大,《跑男》比不了...
  6. 创建windows虚拟机详细教程
  7. Windows系统主机加固
  8. 使用Mybaties xml的增删改查
  9. ECSHOP微信支付插件ECSmart手机版,ECSmart微信支付手机版
  10. 基于SOA的设备智能维护系统架构设计及实现