2015-01-31 269 views
0

我正在寫函數,我需要找到1 - 10之間的隨機數。最簡單的方法之一是使用random()libc調用。我打算使用這個功能很多。但我不知道它會有多高效。如果任何人有關於隨機()的效率的想法,這將是一個幫助?C++中的隨機()效率

另外我注意到random()在2次運行中給出相同的模式。

int main() 
{ 
    for(int i=0;i<10;i++) 
    { 
    cout << random() % 10 << endl;  
    } 
} 

輸出第一時間: - 3 6 7 5 3 5 6 2 9 1

第二時間也我得到相同的輸出。

那麼它是如何隨機的?

+0

使用探查器如果你擔心性能。如果您運行具有相同種子的隨機數發生器,它將始終提供相同的輸出。 – Almo 2015-01-31 18:53:43

+0

其實我使用的是Linux perf,但它沒有顯示任何東西(比如在哪裏消耗時間)。它只是顯示了它消耗了多少CPU週期,佔CPU總量的1.73%左右。 – eswaat 2015-01-31 18:57:12

+1

「效率」與「性能」或「效率」中的「隨機數字有多好」一樣?後者顯然是「您需要使用srand()」[或類似的]在不同點啓動隨機數序列的情況。 「好」隨機數並不是微不足道的,所以如果你需要真正好的隨機數,你可能需要進一步的工作。可預測性成爲問題的遊戲,或在分配很重要的科學目的中使用數字] – 2015-01-31 19:01:00

回答

6

其他人解釋爲什麼它是相同的序列每一次,但你這是怎麼生成C++一個隨機數:

#include <random> 

int main() { 
    std::random_device rd{}; //(hopefully) truly random device 
    std::mt19937 engine{rd()}; //seed a pseudo rng with random_device 
    std::uniform_int_distribution<int> d(1,10); //1 to 10, inclusive 
    int RandNum = d(engine); //generate 
    return 0; 
} 

http://en.cppreference.com/w/cpp/numeric/random

2

實際執行時間取決於你的平臺上當然,但它是非常直接的,夫妻乘法和分裂或轉變:

What common algorithms are used for C's rand()?

我不認爲你應該擔心。如果你需要很多隨機數,那麼另一個隨機數可能對你來說是一個更好的選擇。

如果您正在尋找調整,將rand()的結果拆分爲單個數字以獲得每次調用的多個結果。

+0

將rand()結果分解成單個數字的想法(比方說,4位數據塊從1-10獲得隨機數,比如忽略0000,1111,1110,1101,1100和1011)是一個有趣的一個,但這樣生成[測試隨機數的質量](http://en.wikipedia.org/wiki/TestU01)是很重要的,因爲大多數僞隨機數中的低位通常比較高值的位。 – Simon 2015-01-31 20:25:30

0

這種方式是非常簡單而有效的,你只需要設置種子:

#include <iostream> 
#include <stdlib.h> 
#include <time.h> 

using namespace std; 

int main(){ 
    srand(time(NULL)); 
    for(int i=0;i<10;i++) 
     cout << rand() % 10 << endl;  
} 
0

要修復在2個運行得到相同的模式的問題,剛纔添加的功能隨機化()