2017-07-17 34 views
1

每當我們想從一個向量中選擇一個隨機數時,我們使用一個名爲rand()的方法。我想知道它是如何從後端工作的。cpp的rand()方法的bankend程序是什麼

+2

如果你想了解關於僞隨機數生成的理論,你需要閱讀大量的數學和統計數據。如果您只想查看一些生成僞隨機數的示例函數,那麼如果您只是搜索一些,包括一些標準庫是開源的,那麼這裏有很多可用的函數。 「 –

回答

1

rand沒有涉及"back-end"

順便說一句,在C++中,您最好使用<random>標準頭文件和相關實用程序,它們位於C++ standard library中。

rand功能是C standard library的一部分。它與C++向量無關。

它們(rand函數和<random>的實用程序)均基於pseudo-random number generators,這是一個相當複雜的字段。你仍然可以通過發明更好的PRNG獲得博士學位。

如果你想了解如何rand是(或可以)來實現,你會更好地研究一些現有的free software C標準庫的源代碼(如GNU例如或glibcmusl-libc)。

如果您想了解如何實現<random>,請研究C++標準庫的源代碼。如果使用GCC編譯器(例如使用g++程序進行編譯),則由其提供。

1

rand具有種子值 - 例如,將其設置爲當前時間...

srand(time(NULL)); // second good enough 

然後有一些數學如本....

unsigned int seed; // set by srand 
unsigned int rand() { 
    seed = seed * number + offset; 
    return seed; 
} 

的數目和偏移被選擇,所以整個的`的範圍內的覆蓋了unsigned int。這通常意味着某種形式的質數。

正如評論中所述,這是一個非常複雜的領域。

如果沒有調用srand,那麼seed有一個初始值,這意味着(忽略線程計時問題),每次運行時,程序都會得到相同的結果。

獲得相同的結果對於重新運行測試非常方便,但如果它是遊戲邏輯,則會出現問題。

+0

」選擇數字和偏移量,所以'unsigned int'的整個範圍都被覆蓋「 - False。整個範圍是'0-UINT_MAX',但'rand()'只需要覆蓋'0-RAND_MAX'。這可能低至32767. – MSalters

+0

這個(線性同餘發生器)是'rand()'的一種可能的實現。這是很常見的,但C和C++都不需要這種方法,有些實現的做法是不同的。 –

相關問題