對(duì)C++庫(kù)函數(shù)進(jìn)行學(xué)習(xí)探索總結(jié)筆記
C++庫(kù)函數(shù)作為一個(gè)高效的.NET程序語(yǔ)言。其混合了函數(shù)語(yǔ)言和物件導(dǎo)向程序編制語(yǔ)言,并且***的適用于編程、算法、技術(shù)和探索性開發(fā),因此可以在使用的過(guò)程當(dāng)中感受到趣味性和吸引力。
rand()產(chǎn)生“偽隨機(jī)數(shù)”的原理是:給定數(shù)x(如果調(diào)用者未指定,則使用默認(rèn)值),通過(guò)固定的計(jì)算公式1返回一個(gè)數(shù)y,這個(gè)數(shù)y就是所謂的偽隨機(jī)數(shù);同時(shí)通過(guò)固定的計(jì)算公式2,修改x,這樣下次調(diào)用rand()時(shí)就會(huì)得到一個(gè)新的y。通過(guò)上面這兩步,反復(fù)調(diào)用rand()會(huì)得到一個(gè)所謂的“偽隨機(jī)數(shù)”的序列。
因?yàn)閮蓚€(gè)計(jì)算公式是固定的,所以只要X1相同,那么產(chǎn)生的序列就相同。X1成為種子,seed。
如果調(diào)用者不指定種子,C++語(yǔ)言的rand()會(huì)使用默認(rèn)值。設(shè)置種子使用srand(unsigned int)函數(shù),這個(gè)函數(shù)的名字的***個(gè)字母s就是seed的意思。
因?yàn)闀r(shí)間的唯一性和一維性,所以可以用系統(tǒng)時(shí)間來(lái)作為種子。這樣可以保證每次運(yùn)行時(shí),rand()產(chǎn)生的序列都是不同的。在使用rand()前,以如下方式設(shè)置種子即可,
srand((unsigned int) time(0));
下面是《C Programming Language》中給出的rand()和srand()的一種實(shí)現(xiàn),可能是早期C++的庫(kù)函數(shù)的實(shí)現(xiàn)。
- int rand(void) {
- nextnext = next * 1103515245 + 12345; //修改next的值
- return (unsigned int) (next/65536) % 32768; //得到偽隨機(jī)數(shù)在0~32768之間
- }
- void srand(unsigned int seed) {
- next = seed; //設(shè)置種子
- }
也就是說(shuō),隨便你拿起哪本C++書籍(包括很多被人們廣泛稱為“必讀經(jīng)典”的),那么有很大的可能這本書中的內(nèi)容不是你應(yīng)該學(xué)的,而是你不應(yīng)該學(xué)的。我之所以這么說(shuō)有兩個(gè)原因,因?yàn)橐?,我曾?jīng)是受害者。二,也是更實(shí)質(zhì)性的原因,這些所謂的必讀經(jīng)典。
充斥的是介紹C++中的陷阱和對(duì)于C++庫(kù)函數(shù)的缺陷的各種workarounds(好聽(tīng)一點(diǎn)叫Idioms(慣用法)或techniques(技術(shù)));又因?yàn)?FONT>C++中的這類陷阱和缺陷實(shí)在數(shù)不勝數(shù),所以就拉出了一個(gè)“長(zhǎng)尾”;這類書籍在所有語(yǔ)言中都存在(“C缺陷和陷阱”、“Effective Java”、“Effective C#”等等)。#t#
然而在C++庫(kù)函數(shù)里面這個(gè)尾巴特別長(zhǎng),導(dǎo)致這類書數(shù)不勝數(shù)。三,這些書中列出來(lái)的缺陷和陷阱根本不區(qū)分常見(jiàn)程度,對(duì)于一個(gè)用本程序員來(lái)說(shuō),應(yīng)該希望看到“從最常見(jiàn)的問(wèn)題到最不常見(jiàn)的問(wèn)題”這樣的順序來(lái)羅列內(nèi)容,然而這些書里面要么全部混在一起。
要么按照“資源管理、類設(shè)計(jì)、泛型”這樣的技術(shù)分類來(lái)介紹內(nèi)容,這根本毫無(wú)幫助(如果我看到一個(gè)章節(jié)的內(nèi)容,我當(dāng)然知道它講的是類設(shè)計(jì)還是資源管理,還用廢話么?),使得一個(gè)學(xué)習(xí)者無(wú)法辨別并將最重要的時(shí)間花在最常見(jiàn)的問(wèn)題之上。