2009-11-06 99 views
2

這是一些C++代碼的摘錄,我將有詳細些日子來解釋:C++:&rand做了什麼?

std::vector<int> vct(8, 5); 

std::generate(vct.begin(), vct.end(), &rand); 

std::copy(vct.rbegin(), vct.rend(), 
    std::ostream_iterator<int>(std::cout, "\n")); 

我想我明白它的一切,除了微小的神祕&蘭特。它究竟做了什麼?我的意思是顯然它會產生一些僞隨機數,但它們始終保持不變。 &蘭特從哪裏來?它是什麼樣的表達呢?它產生的價值從何而來?我有點困惑...

另外,我既沒有在代碼中發現任何其他出現的「rand」字樣,也沒有看到任何可能與隨機數字有關的代碼。這讓我想知道,因爲我在C++中的(非常有限的)經驗表明,只有極少數事情可以工作,而不必事先聲明或包含。

感謝您的幫助!

回答

13

& in &rand返回rand()函數的地址。您正在向generate()傳遞函數指針,因此generate()可以調用rand()來生成隨機數。

2

rand在cstdlib中定義。你獲得相同的價值,因爲你使用了相同的「種子」。這是設計。

如果您想要一個不同的種子,請先撥打srand,例如srand(time(NULL));

+0

它是'rand'不是'rnd'。 – 2009-11-06 01:30:12

+0

烏,錯別字將是我的死亡。謝謝肯。 – 2009-11-06 01:31:04

+0

嗯不能決定你的或肯的答案是更好的,但組合正是我所需要的。謝謝! – 2009-11-06 01:37:01

0

rand()是一個函數,它是標準C庫的一部分。它的簽名是:

int rand(void); 

它在stdlib.h中定義。最有可能的是,當你包含or時,你的std C++庫的實現就包含了這個頭文件。

0

&rand只是表示「地址rand」。 rand是從返回僞隨機數的標準庫中的函數。你正在做的是將這個函數的地址傳遞給算法。然後他們在工作過程中調用這個函數。

至於rand本身推移,任何像樣的C++文件將告訴你爲什麼它的行爲你觀察的方式......(和其他的答案在這裏做的一樣好)

5

蘭特()是函數從C標準庫生成僞隨機數在0和定義之間RAND_MAX。如果使用C++,請使用頭文件<cstdlib>來使用它(而不是<stdlib.h>srand()可讓您設置種子。如果每次運行應用程序時都需要一個新種子,則可以使用time()中的值進行種子處理。

POSIX標準從2001年具有一個例子的實現蘭特()srand()函數。我從我的手冊頁複製粘貼它。通過您的C標準庫使用的實現可能會從這個不同:

static unsigned long next = 1; 

/* RAND_MAX assumed to be 32767 */ 
int myrand(void) { 
    next = next * 1103515245 + 12345; 
    return((unsigned)(next/65536) % 32768); 
} 

void mysrand(unsigned seed) { 
    next = seed; 
} 

此外,&從函數接收地址。編譯器在這個部分有點模糊。當你需要函數指針的地址時,有些需要使用這個操作符;別人不會。 生成是來自C++標準庫的<algorithm>標題中的函數。它接受函數和/或函子對象,並使用它爲容器指定的迭代器生成值。