2017-09-14 61 views
-2

我正在寫需要填寫使用2名不同的種子名單隨機整數(小於1000)兩個向量的程序。當我嘗試使用種子時,我應該使用它給我一個非常奇怪的輸出。函數srand工作不正常

這裏是我到目前爲止已經寫的代碼...

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 

void Vectors(vector <int> v1, vector <int> v2, int s1, int s2) { 
    srand(s1); 
    for (int i = 0; i < 200; i++) { 
     v1.push_back(rand() % 1000 + 1); 
     //v1[i] = rand() % 1000 + 1; 
    } 
    srand(s2); 
    for (int i = 0; i < 100; i++) { 
     v2.push_back(rand() % 1000 + 1); 
     //v2[i] = rand() % 1000 + 1; 
    } 
} 

void prnt(vector<int> v) { 
    for (int i = 0; i < 20; i++) { 
     cout << v[i] << " "; 
     if (i == 9 || i == 19) { 
      cout << endl; 
     } 
    } 
} 

int main() { 
    vector<int> vec1; 
    vector<int> vec2; 
    vec1.resize(200); 
    vec2.resize(100); 
    Vectors(vec1, vec2, 1, 3); 
    prnt(vec1); 
    prnt(vec2); 
    return 0; 
    system("pause"); 
} 

然而,當我運行它的輸出我得到的是這樣的......

0  29046  -309340552  29046  32  0  134113 0 0 0 
-309339528  29046  64  0 48 0 0 0 986 169 
0 0 -309340552 29046 32 0 134113 0 0 0 
-309339528 29046 64 0 48 0 0 0 986 169 

此外,將如果vec1和2未初始化爲某種大小,則不允許使用Vectors方法。

我剛剛從Java轉移到C++,所以你可以給我任何幫助將是非常讚賞,因爲它是令人抓狂被卡住的東西在Java中

+2

偏離主題,但爲什麼把'system(「pause」);''返回0後''? – Amadeus

+0

有兩種方法來處理矢量。你可以調整它們的大小,因爲你正在分配N個項目,你可以把它們分配爲'v [0] .. v [v.size() - 1]',或者你可以使用'push_back'將大小增加一個並在最後添加新項目。你現在正在做的是爲200個項目分配空間,然後在最後增加200個,這可能不是你想要做的。 –

+1

有時候錯誤可以挽救你的生命。現在是停止使用rand()並切換到現代C++隨機生成器的時候了。 – CroCo

回答

3
void Vectors(vector <int> v1, vector <int> v2, int s1, int s2) { 

你傳遞的載體那麼微不足道按價值而不是參考,所以你要更改副本,而不是原件。

相反,通過引用傳遞:

void Vectors(vector <int> & v1, vector <int> & v2, int s1, int s2) { 

,你會改變原有的載體,你會看到在函數外更改。

0

您的輸出似乎不正確!

resize應該將值設置爲0.根據我所知,Visual Studio 2017的確如此,這是來自標準的預期行爲。

上述程序應打印4排五0

Vectors具有自身之外沒有任何效果使它複製並修改副本(如在前面的答案已經說過)。

然而,當你調用prnt,副本是隻有一些效率的浪費,但你應該打印相同的值作爲主。儘管如此,打印20個號碼並不確保您擁有它們並不是一個好主意。它使代碼變得脆弱......因爲必須確保已添加足夠的項目。

說了這麼多,你Vectors函數是一個糟糕的設計。

  • 首先,這個名字是沒有意義的。
  • 其次,代碼是重複性的。所以有一個函數可以讓一個給定種子的一個向量隨機化好得多。瞭解DRY原則。
  • 第三,它需要一個載體副本,它主要只是浪費時間。

一些旁註:

  • 前面已經說過有人,你應該使用現代隨機生成了。
  • 要麼使用reserve或更新現有項目,而不是增加新的一個。用200個零填充向量並在最後添加200個額外的隨機數是沒有意義的。