2012-06-10 3 views
0

기본적으로이 할당을 위해 무작위로 숫자를 기준으로 문자 열을 무작위로 생성하는 미니 프로그램을 만들어야합니다 (0은 A에 해당하고 1은 B에 해당함). , 2는 C에 해당하는 등)가 생성 된 n 번째 문자열에 해당하는 숫자 n과 함께 표시됩니다. 이 문자열과 해당 번호는 텍스트 파일로 인쇄됩니다. 예를 들어, 내 기능은 myFunction를 호출 된 경우 :C++ 미니 프로그램 무작위 화 된 데이터 쌍을 인쇄합니다

AAAAAAAA 1 
IWFNWEFS 2 
WEWEFCSD 3 

문자열 '문자가 각각 무작위로되어있다 :

myFunction("file.txt", 3) 

는 다음과 같은 내용으로 "file.txt를"라는 텍스트 파일을 생성합니다 .

그러나 어떤 이유로 모든 문자열이 어떤 이유로 동일합니다. 즉, 문자열 번호 쌍의 각 행에 대해 모든 문자열이 동일하게 나타납니다 (모든 문자열이 서로 다르거 나 임의로 만들어야하는 경우). 왜 이런 일이 일어나는 걸까요? 여기 내 코드입니다 : 내가 처음 부분에 모두 srand (time(NULL));srand (1);를 사용하여 시도

#include <iostream> 
#include <vector> 
#include <cstdlib> 
#include "math.h" 
#include <fstream> 
using namespace std; 

string key = ""; // Empty initial key for use in "makeKey". 

// "makeKey" function to create an alphabetical key 
// based on 8 randomized numbers 0 - 25. 
void makeKey() { 
    int k; 
    for (k = 0; k < 8; k++) { 
     int keyNumber = (rand() % 25); 
     if (keyNumber == 0) 
      key.append("A"); 
     if (keyNumber == 1) 
      key.append("B"); 
     if (keyNumber == 2) 
      key.append("C"); 
     if (keyNumber == 3) 
      key.append("D"); 
     if (keyNumber == 4) 
      key.append("E"); 
     if (keyNumber == 5) 
      key.append("F"); 
     if (keyNumber == 6) 
      key.append("G"); 
     if (keyNumber == 7) 
      key.append("H"); 
     if (keyNumber == 8) 
      key.append("I"); 
     if (keyNumber == 9) 
      key.append("J"); 
     if (keyNumber == 10) 
      key.append("K"); 
     if (keyNumber == 11) 
      key.append("L"); 
     if (keyNumber == 12) 
      key.append("M"); 
     if (keyNumber == 13) 
      key.append("N"); 
     if (keyNumber == 14) 
      key.append("O"); 
     if (keyNumber == 15) 
      key.append("P"); 
     if (keyNumber == 16) 
      key.append("Q"); 
     if (keyNumber == 17) 
      key.append("R"); 
     if (keyNumber == 18) 
      key.append("S"); 
     if (keyNumber == 19) 
      key.append("T"); 
     if (keyNumber == 20) 
      key.append("U"); 
     if (keyNumber == 21) 
      key.append("V"); 
     if (keyNumber == 22) 
      key.append("W"); 
     if (keyNumber == 23) 
      key.append("X"); 
     if (keyNumber == 24) 
      key.append("Y"); 
     if (keyNumber == 25) 
      key.append("Z"); 
    } 
    return; 
} 

// "makeFile" function to produce the desired text file. 
// Note this only works as intended if you include the ".txt" extension, 
// and that a file of the same name doesn't already exist. 
void makeFile(string fileName, int n) { 
    ofstream ourFile; 
    ourFile.open(fileName); 
    int k; // For use in below loop to compare with n. 
    int l; // For use in the loop inside the below loop. 
    for (k = 1; k <= n; k++) { 
     for (l = 0; l < 8; l++) { // To write to the file ONE key 
     ourFile << key[l];   // C++ only lets me do it this way... 
     } 
     ourFile << " " << k << "\n"; // Writes two spaces and the data value 
    } 
} 

// Primary function to create our desired file! 
void mainFunction(string fileName, int n) { 
    makeKey(); 
    makeFile(fileName, n); 
} 

int main() { 
    mainFunction("file.txt", 3); // To test program 
    cin.get(); 
    return 0; 
} 

,하지만 그 중 하나가 나를 위해 작동하지 않았다.

+0

이것은 너무 열심히 일하고 있습니다. 문자의 배열 (단순한 문자열)을 만들고 배열의 인덱스로 임의의 숫자를 사용하십시오. – Gene

답변

1

makeKey을 호출 할 때마다 key 끝에 8자를 추가하지만 이전 내용을 지우지 않고 makeKey을 호출 한 후에 변경되지 않은 처음 8자를 인쇄합니다.

전역 변수 key을 없애고 makeKey을 호출 할 때마다 (새로 만든) std::string을 반환해야합니다.

FWIW 또한 makeKey을 재 작성하여 숫자 배열을 char 배열로 인덱싱하여 문자로 변환 할 수 있습니다.

편집 (문제의 편집에 대한 응답으로) : 예, 아마도 프로그램의 시작 부분에 srand(time(NULL));을 사용하려고합니다. srand(1);srand 번으로 전화를 걸지 않은 경우와 같습니다. 일반적으로 srand(time(NULL));을 사용하면 프로그램을 실행할 때마다 다른 순서의 결과가 나타납니다 (두 번 빨리 실행하여 시스템 시계가 변경되지 않는 경우 (일반적으로 같은 초에 두 번).

지금은 한 번 더 8 번 반복됩니다. 위에서 언급 한 문제를 해결하면 8 개의 다른 문자열을 얻을 수 있습니다. 그러나 srand(time(NULL)); 같은 것이 없으면 프로그램을 실행할 때마다 8 개의 문자열로 이루어진 동일한 그룹을 갖게됩니다. srand(time(NULL));을 추가하고 나머지는 고치지 않으면 한 문자열을 8 번 얻을 수 있지만 프로그램을 실행할 때마다 다른 문자열이됩니다 (반면 지금 당장 얻을 수있는 문자열은 프로그램을 실행할 때마다).

+0

전역 변수를 없애면 다른 함수가 모두 키를 참조하기 때문에 더 이상 작동하지 않을까요? – forthewinwin

+0

@forthewinwin : 예,'makeKey'의 반환 값을 참조하기 위해 비트를 다시 작성해야합니다. 'std :: string key = makeKey();'(같은 이름을 계속 사용)와 같은 것을 사용하면 다른 코드로의 변경을 최소화 할 수 있습니다. –

+0

어디에서'key = makeKey();'문자열을 사용할 것인가? 'makeFile' 위에 삽입 해 보았습니다. 처음에 맨 위에서 선언 한 전역 변수'key'를 제거하고'makeKey'가'key'를 반환하도록했지만, 여전히 나에게 같은 문제가 있습니다.내부 루프에서 동일한 '키'를 사용하여 makeFile과 관련이 있다고 생각하지만, 어떻게 모든 것을 다시 작성해야할지 모르겠습니다. – forthewinwin

관련 문제