2016-07-07 2 views
0

나는 동의어 퍼즐을 연구 중이며, 단어를주고 단어의 길이가 주어지면 동의어를 찾고 싶어한다. 모든 것은 정상적으로 작동하지만 순서대로 수행됩니다. 단어가 임의로 나타나지 않습니다. 그럴 수없는 임의의 숫자의 k 번호가 필요합니다. 여기에 내 코드입니다 : 당신이 볼 수 있듯이반복되지 않는 난수

#include<iostream> 
#include<string> 
#include<cstdlib> 
#include<ctime> 
using namespace std; 

int main() 
{ 
    const int k=4; 
    string word[k]={"furious","tiny","untrue", "humorous", "harm"}; 
    string nword[k]={"angry","small","false", "funny", "damage"}; 
    string j; 
    int point, p = 0; 
    int ctr=0; 

    srand(time(NULL)); 
    int randNum = (rand() % k) + 0; 


    for(int i=0; i<k; i++) 
    { 
     cout << nword[i] << "\n"; 
     cout << "The length of the word: " << word[i].length() << "\n"; 
     cin>>j; 



     ctr++; 
     if(j==word[i]) 
     { 
      cout<<"Correct! Score: " << i+1 << " point." << "\n\n"; 


     } 
     else 
     { 
      cout<<"Wrong"<<endl; 
     } 

    } 

    return 0; 
} 

이 변수 randNum가 k로 0에서 임의의 숫자의 값을 유지 (k는 0과 결합, 4, 내가 5 개 단어를 가지고). for 루프에서 단어와 단어를 nword[randNum]word[randNum]과 같이 설정하면 결과가 많이 남습니다. 첫째, 두 단어 (단어 및 단어)에 동기화가없는 것 같습니다. 그것은 두 개의 다른 난수를 적용 할 것이고 (나는 잘못되었을 수도 있습니다) 두 번째는 반복적입니다. 위에서 볼 수 있듯이 실행은 점수 기반이고 완료 가능하므로 k에 도달 할 때까지 반복되지 않는 질문이 필요합니다.

+2

루프를 사용하여 a가, 확인 – Li357

+1

하나 좋은 점은 무엇 번호를 기억하는 것입니다 당신이 그 (것)들을 건너 뛰어 얻을 때. –

+1

@AndrewL. 수학적으로 가능한 무한 루프에 갇히게됩니다. –

답변

2

당신은이 Durstenfeld shuffle 사용하여 단어의 배열을 셔플 수 :

는 바와 같이 WhozCraig, 다른 옵션 (틀림없이 더 나은, 그것은 여러 배열을 치환하는 요구하지 않는 한)에 의해 지적
for(int i=k-1; i>0; i--) 
{ 
    int j = rand() % (i+1) 

    string temp = word[i]; 
    word[i] = word[j]; 
    word[j] = temp; 

    temp = nword[i]; 
    nword[i] = nword[j]; 
    nword[j] = temp; 
} 

,을 만드는 것입니다 인덱스 0 .. (k-1) 배열을 사용하고 대신이 배열을 섞습니다. 이 배열에는 단어 배열을 반복하는 데 사용할 수있는 무작위 색인 집합이 들어 있습니다. 생성 된 NUM이 마지막 것과 같을 경우 이렇게 생성을 다시 실행하면 당신은 당신이 원하는 독특한 nums의 수에 도달 할 때까지

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <random> 
#include <numeric> 
using namespace std; 

int main() 
{ 
    static const size_t k=5; 
    string word[k]={"furious","tiny","untrue", "humorous", "harm"}; 
    string nword[k]={"angry","small","false", "funny", "damage"}; 
    int ctr=0; 

    // build prng 
    std::random_device rd; 
    std::mt19937 rng(rd()); 

    // build index sequence, then shuffle 
    size_t idx[k]; 
    std::iota(std::begin(idx), std::end(idx), 0); 
    std::shuffle(std::begin(idx), std::end(idx), rng); 

    for(auto i : idx) 
    { 
     std::string s; 
     cout << nword[i] << "\n"; 
     cout << "The length of the word: " << word[i].length() << "\n"; 
     if (!(cin>>s)) 
      break; 

     if(s==word[i]) 
     { 
      cout<<"Correct! "; 
      ++ctr; 
     } 
     else 
     { 
      cout<<"Wrong. "; 
     } 
     std::cout << "Score: " << ctr << " point(s).\n\n"; 
    } 

    return 0; 
} 
+0

그것은 나에게 오류를 준다 : 's'는 if (! (cin >> s))와 if (! (cin >> s)) 행에 선언되지 않았다. –

+0

@BerdiyaOnur 비록 내가이 코드를 작성하지 않았지만 (WhozCraig는 편집시 코드를 추가했습니다), 그것은 나를 위해 잘 구축 된 것 같습니다. 직접 코드를 복사/붙여 넣기 했습니까? 아니면 각 줄을 수동으로 통합 했습니까? 메인 루프 맨 위에'string s' 선언이 있는지 확인하십시오. –

+0

코드를 컴파일하고 예를 복사 한 후 붙여 넣습니다. 그것은 여전히 ​​무작위가 아닙니다. 시도해 보셨습니까? –

관련 문제