从零单排c++ primer(22)

(1)c++程序不应该使用库函数rand,而应使用default_random_engine类和恰当的分布类对象。
(2)定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类和随机数分布类。
(3)对于大多数场合,随机数引擎的输出是不能直接使用的,这也是为什么早先我们称之为原是随机数。
(4)类似引擎类型,分布类型也是函数对象类,分布对象使用它的引擎参数生成随机数,并将其映射到指定的分布。
(5)当我们说随机数发生器时,是指分布对象和引擎对象的组合。 

(6)随机数发生器生成的数看起来是随机的,但是对一个给定的发生器,每次运行程序它都会返回相同的数值序列。


            vector<unsigned> bad_randVec()
            {
                    default_random_engine e;
                    uniform_int_distribution<unsigned> u(0,9);
                    vector<unsigned> ret;
                    for(size_t i = 0 ; i < 100 ; ++i)
                        ret.push_back(u(e));
                    return ret;
            }
            
            vector<unsigned>  v1(bad_randVec());
            vector<unsigned>  v2(bad_randVec());    
            cout << (v1 == v2 ) ? " equal " : " not equal " << endl;

(7)一个给定的随机数发生器一直会生成相同的随机数序列。
(8)一个函数如果定义了局部的随机数发生器,应该将其包括引擎和分布对象定义为static的。否则每次调用的函数都会生成相同的序列。
(9)如果程序作为一个自动过程的一部分反复运行,将time的返回值作为种子的方式就无效了;它可能多次使用的都是相同的种子。
(10)由于引擎返回相同的随机数序列,所有我们必须再循环外声明引擎对象。否则每步循环都会创建一个新引擎,从而每步循环都会生成相同的值。类似的,分布对象也要保持状态,因此也应该在循环外定义。
(11)操作符用于两大类输出控制:控制数值的输出形式以及控制补白的数量和位置。
(12)当操作符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。
(13)操作符hex、oct和dec只影响整型运算对象,浮点值的表示形式不受影响。
(14)随机IO本质上是依赖与系统的,为了理解如何使用这些特性,你必须查询系统文档。
(15)由于只有单一标记,因此只要我们在读写操作间切换,就必须进行seek操作来重定位标记。
(16)与仅需几个程序员就能开发完成的系统相比,大规模编程对程序设计语言的要求更高。大规模应用程序的特殊要求包括:
                在独立开发的子系统之间协同处理错误的能力 
                使用各种库进行协同开发的能力
                对比复杂的应用概念建模的能力
          c++语言特性正好满足上述要求,它们是:异常处理,命名空间和多继承
(17)异常处理使得我们能够将问题的检测与解决过程分离开来。
(18)在c++语言中,我们通过抛出一条表达式来引发一个异常。
(19) 当执行一个throw时,跟在throw后面的语句将不再被执行,相反,程序的控制权从throw转移到与之匹配的catch模块。
(20)一旦程序开始执行异常处理代码,则沿着调用链创建的对象将被销毁。
(21) 一个异常如果没有被捕获,则它将终止当前的程序。 

你可能感兴趣的:(C++,学习,语言,VC,C++Primer)