C++库函数作为一个高效的.NET程序语言。其混合了函数语言和物件导向程序编制语言,并且***的适用于编程、算法、技术和探索性开发,因此可以在使用的过程当中感受到趣味性和吸引力。
rand()产生“伪随机数”的原理是:给定数x(如果调用者未指定,则使用默认值),通过固定的计算公式1返回一个数y,这个数y就是所谓的伪随机数;同时通过固定的计算公式2,修改x,这样下次调用rand()时就会得到一个新的y。通过上面这两步,反复调用rand()会得到一个所谓的“伪随机数”的序列。
因为两个计算公式是固定的,所以只要X1相同,那么产生的序列就相同。X1成为种子,seed。
如果调用者不指定种子,C++语言的rand()会使用默认值。设置种子使用srand(unsigned int)函数,这个函数的名字的***个字母s就是seed的意思。
因为时间的唯一性和一维性,所以可以用系统时间来作为种子。这样可以保证每次运行时,rand()产生的序列都是不同的。在使用rand()前,以如下方式设置种子即可,
srand((unsigned int) time(0));
下面是《C Programming Language》中给出的rand()和srand()的一种实现,可能是早期C++的库函数的实现。
- int rand(void) {
- nextnext = next * 1103515245 + 12345; //修改next的值
- return (unsigned int) (next/65536) % 32768; //得到伪随机数在0~32768之间
- }
- void srand(unsigned int seed) {
- next = seed; //设置种子
- }
也就是说,随便你拿起哪本C++书籍(包括很多被人们广泛称为“必读经典”的),那么有很大的可能这本书中的内容不是你应该学的,而是你不应该学的。我之所以这么说有两个原因,因为一,我曾经是受害者。二,也是更实质性的原因,这些所谓的必读经典。
充斥的是介绍C++中的陷阱和对于C++库函数的缺陷的各种workarounds(好听一点叫Idioms(惯用法)或techniques(技术));又因为C++中的这类陷阱和缺陷实在数不胜数,所以就拉出了一个“长尾”;这类书籍在所有语言中都存在(“C缺陷和陷阱”、“Effective Java”、“Effective C#”等等)。#t#
然而在C++库函数里面这个尾巴特别长,导致这类书数不胜数。三,这些书中列出来的缺陷和陷阱根本不区分常见程度,对于一个用本程序员来说,应该希望看到“从最常见的问题到最不常见的问题”这样的顺序来罗列内容,然而这些书里面要么全部混在一起。
要么按照“资源管理、类设计、泛型”这样的技术分类来介绍内容,这根本毫无帮助(如果我看到一个章节的内容,我当然知道它讲的是类设计还是资源管理,还用废话么?),使得一个学习者无法辨别并将最重要的时间花在最常见的问题之上。