2013-08-06 1 views
3

내 의도는 반복없이 1 ~ 9 난수를 생성하는 것입니다C++ 반복없이 임의의 숫자를 생성. 출력 화면에는 깜박이는 커서가 비어 있습니다.

#include<iostream> 
#include<ctime> 
#include<cstdlib> 
using namespace std; 
int randrange(int low,int high) /* generates a random number within given range*/ 
{ 
    return rand()%(low+high)+low+1;  
} 

int main() 
{ 
    int num[9]={0},i,j;  
    bool check;       
    for(i=0;i<9;i++) 
    { 
     check=false; 
     do 
     { 
      num[i]=randrange(1,9);   

      for(j=0;j<i;j++) 
      { 
       if(num[i]==num[j]) // checks whether number already exists in the array 
        check=false; 
       else 
        check=true; 
      } 
     } while(check==false); 
    } 

    // the program is working fine without the repetition check 
    // this section prints out the array elements 
    for(i=0;i<9;i++) 
    { 
     cout<<num[i]<<" "; 
    } 
    return 0; 
} 

답변

5

귀하의 중복 체크 루프는 결함이 다음 check 오히려 결과보다 값의 마지막 쌍의 확인 결과, 설정을 앞의 모든 쌍을 확인하십시오.

내부 루프 앞에 check = true을 설정하고 0부터 i-1까지의 모든 항목을 확인해야합니다.

int randrange(int low,int high) 
{ 
    return rand()%(high-low+1)+low;  
} 
6

단지를 생성 : 현재 구현 범위 2..11의 값을 반환하기 때문에

check = true; 
for (j = 0 ; (check) && (j < i) ; j++) { 
    check = (num[i] != num[j]); 
} 

는 또한, 당신은의 randrange을 수정해야합니다 : 검사가 어느 시점에 false이되면, 루프를 중지 1에서 9까지 숫자를 입력 한 다음 std::random_shuffle을 사용하여 무작위로 임의로 섞습니다.

int nums[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
std::random_shuffle(nums, nums + 9); 

이없이 반복하여, 임의의 순서로 1부터 9까지의 숫자와 nums을 떠날 것이다.

+1

을 더 나은 알고리즘, 그것은 문제가 무엇인지, 왜 프로그램이 멈추는 지 OP 질문에 대답하지 않습니다. –

0

프로그램에는 많은 결함이 있으며, 그 중 하나는 randrange 함수가 반환하는 임의의 숫자 범위입니다. 1에서 9가 아닙니다!

프로그램 (프로그램의 교수형)의 직접적인 원인은 i0j와 내부 루프, 당신은 checkfalse에가, 다음 (약 때문에 처음 아무것도하지 않는 루프를 수행 설정할 수 있다는 점입니다 수행되지 않습니다.)이므로 check은 항상 false입니다.

해결책에 대한 다른 답변을 확인하십시오.

0

아마도 프로그램이 반복 중입니다. 이 때문에 당신의 이상한 들여 쓰기의 코드를 읽을 조금 어렵지만, 논리의 결함이 거기처럼 그것은 여기에 루프를 찾습니다

check=false; 
do 
{ 
    num[i]=randrange(1,9);   

    for(j=0;j<i;j++) 
    { 
     if(num[i]==num[j]) // checks whether number already exists in the array 
      check=false; 
     else 
      check=true; 
    } 
} while(check==false); 

당신은 내가 '당신을 생각해야 할 두 번째 check=false; 줄을 제거 할 수 있습니다 다시하려고합니다.

0

좋아, 당신은 이미 dasbinkenlight의 대답하여 문제를 파악했을 수도

베드로의 대답 이외에, 당신은 고유 한 난수를 달성하기 위해 너무 std::map을 사용할 수 있습니다 : 이것은 _much_이지만

std::map<int,int> m; 
srand (time (NULL)); 
for(i=0;i<9;i++){ 
    do{ 
    j=randrange(1,9);   
    }while(m.find(j)!=m.end()); 

m[j]; //insert into map, no need for value. 
num[i]=j; 
}