2017-04-09 30 views
0

我有一個創建大小爲N的向量函數,它打亂:即使我反覆重置srand(時間(NULL)),爲什麼還能順利運行?

void rand_vector_generator(int N) { 
    srand(time(NULL)); 
    vector <int> perm(N); 
    for (unsigned k=0; k<N; k++) { 
     perm[k] = k; 
    } 
    random_shuffle(perm.begin(),perm.end()); 
} 

我打電話這個從我與循環主要功能:

for(int i=0; i<20; i++) 
    rand_vector_generator(10); 

我想到這不是在我的洗牌中給我足夠的隨機性,因爲我打電話給每個函數調用srand(time(NULL));,並且種子與連續的調用呼叫沒有太大差別。我的理解是我撥打srand(time(NULL));一次而不是多次,因此種子不會「重置」。

thread有點肯定我期待的結果是。

相反,我得到:

6 0 3 5 7 8 4 1 2 9 
0 8 6 4 2 3 7 9 1 5 
8 2 4 9 5 0 6 7 1 3 
0 6 1 8 7 4 5 2 3 9 
2 5 1 0 3 7 6 4 8 9 
4 5 3 0 1 7 2 9 6 8 
8 5 2 9 7 0 6 3 4 1 
8 4 9 3 1 5 7 0 6 2 
3 7 6 0 9 8 2 4 1 5 
8 5 2 3 7 4 6 9 1 0 
5 4 0 1 2 6 8 7 3 9 
2 5 7 9 6 0 4 3 1 8 
5 8 3 7 0 2 1 6 9 4 
7 4 9 5 1 8 2 3 0 6 
1 9 2 3 8 6 0 7 5 4 
0 6 4 3 1 2 9 7 8 5 
9 3 8 4 7 5 1 6 0 2 
1 9 6 5 3 0 2 4 8 7 
7 5 1 8 9 3 4 0 2 6 
2 9 6 5 4 0 3 7 8 1 

這些載體似乎很隨機洗牌的給我。我錯過了什麼? srand調用是否存在於與函數調用不同的範圍內,因此每次調用都不會重置?或者我誤解了更重要的東西?

+5

'random_shuffle'不一定調用'rand'。 – aschepler

+0

這個標準在'random_shuffle'上肯定有幾個去處http://en.cppreference.com/w/cpp/algorithm/random_shuffle是(3)在C++ 17及更高版本中唯一有效的? –

+1

你會如何判斷某物是否具有「足夠的隨機性」?你是否運行過任何統計測試? –

回答

3

根據標準在兩個std::random_shufflestd::shuffle使用std::rand實現定義(雖然它常常是一個std::rand使用這不能保證的情況下)。試試在另一個編譯器上?另一個平臺?

如果你想確保std::rand使用你應該讓你的代碼中使用它明確地(例如,使用拉姆達表達):

random_shuffle(perm.begin(), perm.end(), []{return std::rand();}); 

在一個有點不相關的說明,time()的精度是整整一秒,你的代碼運行的方式比那個更快(我希望),所以這些多個調用srand()導致重置爲相同的ish 種子

+0

Std :: rand沒有正確的簽名作爲std :: random_shuffle的第三個參數。 – rici

+0

你是對的。我應該說「僞代碼」,因爲這只是說明應該如何完成而不是實際執行。 – YePhIcK

相關問題