2017-09-14 17 views
-2

2 개의 다른 시드 목록을 사용하여 두 개의 벡터를 무작위 int (1000 미만)로 채워야하는 프로그램을 작성했습니다. 씨를 사용하려고 할 때 씨앗을 사용하려고하면 아주 이상한 결과가납니다. 나는 그것이 내가 얻을 출력이 인 실행할 때 여기 srand가 제대로 작동하지 않습니다.

도 ... 그러나 ...

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 

#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"); 
} 

지금까지 작성한 코드, 그것은 것입니다 vec1과 2가 어떤 크기로 초기화되지 않으면 Vectors 메서드를 사용할 수 없습니다.

난 그냥 C로 자바에서 전송 한

++ 그래서 당신은 저를 제공 할 수있는 도움은 매우는 자바 당신은 벡터에 전달하는

+2

주제를 벗어나지 만, 왜'return 0;'뒤에'system ("pause"); – Amadeus

+0

벡터를 다루는 방법에는 두 가지가 있습니다. 당신은 당신이'v [0] .. v [v.size() - 1]'로 주소를 지정할 수있는 N 개의 항목을 할당하거나,'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은 내가 아는 한 표준에서 예상 한 동작입니다.

위의 프로그램은 다섯 0

Vectors의 4 개 행을 인쇄해야 그 복사본을 만들고 (이미 이전 답변에서 말했듯이) 복사본을 수정 한 자체의 외부 효과가 없습니다.

그러나 prnt으로 전화를 걸면 복사 효율이 약간만 향상되지만 main과 동일한 값을 인쇄해야합니다. 그럼에도 불구하고 20 개의 숫자를 가지고 있는지 확인하지 않고 20 개의 숫자를 인쇄하는 것은 좋지 않습니다. 코드가 깨지기 쉽습니다 ... 충분한 항목이 추가되었는지 확인해야합니다.

귀하의 Vectors 기능이 좋지 않습니다.

  • 먼저 이름은 의미가 없습니다.
  • 두 번째 코드는 반복적입니다. 따라서 주어진 시드로부터 1 개의 벡터를 무작위로 추출하는 함수를 갖는 것이 훨씬 낫습니다. DRY 원리에 대해 배우십시오.
  • 셋째, 벡터 복사본을 주로 사용하므로 시간이 낭비됩니다.

일부 측면 노트 :

  • 는 이미 누군가에 의해, 당신은 너무 현대적인 무작위 생성기를 사용한다고 말했다.
  • reserve을 사용하거나 새 항목을 추가하는 대신 기존 항목을 업데이트하십시오.벡터를 200 개의 0으로 채운 다음 끝에 200 개의 추가 난수를 추가하는 것은 의미가 없습니다.