2012-08-31 3 views
0

여기 좀 이상한 상황이 있는데, 저를 도울 수 있다고 생각했습니다. 1에서 10 사이의 숫자로 채워진 int 배열이 있습니다.이 배열에서 임의의 숫자를 생성하고 다른 int 배열에 저장하고 싶습니다. 나는 어떤 번호를 선택하는 Random 클래스를 사용하여 임의 0을 발생하기 때문에도 나는 그런 수정 (그래서 1에서 10까지 숫자를 throw)자바 프로그램에서 이상한 결과가 나옵니다.

randNum = rand.nextInt(numbers.length-min+1)+min; 

다음 코드는이 같은 난수를 생성하는 경우, 그것은 건너 뛰고 있는지 확인합니다 그것. 프로그램이 실제로 작동하고 1에서 10까지 무작위로 배열 된 다른 배열이 나타납니다. 그게 내가 원하는 것입니다. 하지만 때때로 1에서 10까지 하나의 숫자가 누락되었습니다. 그리고 iam 대신 Zero를 얻습니다. 왜??

int[] numbers = {1,2,3,4,5,6,7,8,9,10}; 
int[] usednum = new int[10]; 
Random rand = new Random(); 
int randNum; 
int min = 1; 

for (int x = 0; x<numbers.length; x++) {   
    for (int i = 0; i<usednum.length; i++) { 
    randNum = rand.nextInt(numbers.length-min+1) + min; 
    for (int f = 0; f<usednum.length; f++) { 
     if (usednum[f] == randNum) { 
     break; 
     } else if (usednum[f] == 0) { 
     usednum[x] = randNum; 
     } 
    } 
    } 
} 

for (int c = 0; c<usednum.length; c++) { 
    System.out.println(usednum[c]); 
} 
+0

작품, 실행 10 배 –

+1

나는 이것을 실행하고 오류가 있음을 확인했다 : 나는 당신이 뭔가에 코드를 변경하려는 것이라 생각합니다. –

+0

'g '의 목적은 무엇입니까? 당신은 그것을 할당하지만 그것을 사용하지 마십시오. –

답변

2

가장 내부에 있습니다. for 루프는 현재 난수가 usednum[] 배열에 있는지 검사합니다. 그리고 그 바로 바깥 쪽의 for 루프는 번 10 번 총만을 체크합니다. 그것은 단지 10 개의 난수를 시도하기 때문에 너무 빨리 포기합니다.

 for(int i = 0; i<usednum.length; i++) { 
      while(usednum[i]==0) { 
       randNum = rand.nextInt(numbers.length-min+1)+min; 
       for(int f = 0; f<usednum.length; f++) { 
       if(usednum[f] == randNum) { 
        break; 
       } //if                                   
       else if (usednum[f] == 0) { 
        usednum[i] = randNum; 
       } 
       } 
      } 
     } 
: 모두 (10)가 이미 사용하는 경우, 아무것도, 그 주위에 while 루프를 추가하는 시도하고 관계없는 가장 바깥 쪽 for 루프 제거 (이 0이 될 것입니다 때문에) usednum[]의 슬롯에 저장되지 얻을 것이다

또한 할당은 usednum[i] = randNum;입니다.

이것은 본질적으로 중간 루프(i = 0에서 9까지가는 루프)을 while 루프로 대체합니다.

+0

내 친구 고마워. 그게 완벽하게 .. =)) 많은 감사! –

0

편집 - 그것을 다음과 다시 쓴 : 당신은 전체 패스를 통해 사용 번호를 생성하는

List<Integer> numbers = new LinkedList<Integer>(Arrays.asList(new Integer[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 })); 
     int[] usednum = new int[10]; 
     Random rand = new Random(); 
     int n = numbers.size(); 
     for (int i = 0; i < n; i++) { 
      int randNum = rand.nextInt(numbers.size()); 
      usednum[i]=numbers.get(randNum); 
      numbers.remove(randNum); 
     } 
     for (int c:usednum) { 
      System.out.println(c); 
     } 
+2

번호. 귀하의 경우에는 10, 동일한 생성 된 숫자를 얻을 것이다. –

+1

코드를 변경하십시오. 나는 이것이 정확하다고 생각하지 않는다! –

+0

수정 됨 - 다시 확인해주세요. - 죄송합니다. – Dan

0

를, 그래서 제로 그냥 값을 생성하는 데 실패 생성하지 않습니다 그것은 할까요. 당신의 목표는 숫자의 배열을 셔플하는 것입니다 경우

+0

나는 이것이 어떤 의미가 있다고 생각합니다. 왜 정확히 값을 생성하지 못합니까? –

+0

이전에 모두 사용 된 10 개의 값을 생성합니다. 코드에서'randNum = 4;'를 사용하면 4 번째와 9 번째 0을 얻을 수 있습니다. – Sign

2

, 대신이 시도 :

Integer[] numbers = {1,2,3,4,5,6,7,8,9,10}; 
Collections.shuffle(Arrays.asList(numbers)); 

그것은 동일한 효과를 얻을 수 있습니다. 더 수동 방식으로 문제를 해결하도록 과제를 완수하지 않는 한, 표준 Java 라이브러리를 사용하십시오.

메서드는 Arrays.asList(...)에 의해 반환 된 List의 특수 유형 덕분에 기본 Integer 배열로 변경 내용을 씁니다. 참고 Integer이 아닌 int 배열을 사용해야합니다 (Why does Collections.shuffle() fail for my array? 참조).

+0

답을 고맙습니다. 그러나 당신이 말했듯이 나는 열심히 나의 숙제를 끝내야한다. 그것은 바보 같은 소리 야. –

+0

글쎄, 당신에게 도전하는 것은 충분히 어렵다. 그것은 좋은 일이다! 앞으로는 "숙제"태그로 이러한 질문을 표시하여 사람들이 귀하의 질문에보다 건설적인 방식으로 대답하도록하십시오. –

0

루프 용으로 너무 많습니다.

반복자를 사용하여 루프를 제거하면 프로그램이 원하는 것을 수행해야합니다.

제로와 상기 난수 발생기로부터라는 우수한 성능을 나타내었다 + 1을 제거 -1 + 1 = 0

+0

-min + 1은 아마도 앞으로 사용 될 것입니다. –

0

어레이 usednum가 처음에 제로 구성된다.어떤 경우에는 프로그램이 그 초기 값을 변경할 수 있지만 휴식 시간 전에 라인에 있지 않습니다

if(usednum[f] == randNum) 

및 않습니다 같은 값 x 모든 반복하는 동안. X 씩 증가하고 0 값을 변경할 기회가 있습니다.

0

실제로는 배열 numbers의 내용을 사용하지 않습니다. 배열을 int[] numbers = { 10, 22, 23, 42, 53, 18, 7, 8, 93, 10 };과 같은 것으로 변경해보십시오. 당신은 비슷한 출력을 얻을 것이다.

Jon Lin's answer은 코드가 작동하지 않는 이유를 설명하지만이 문제를 해결하지 못합니다. 나를 위해

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    int[] usednum = new int[10]; 
    Random rand = new Random(); 

    int selectedCount = 0; 

    while (selectedCount < numbers.length) { 
     int randNum = numbers[rand.nextInt(numbers.length)]; 
     boolean contains = false; 
     for (int x = 0; x < selectedCount; x++) { 
      if (usednum[x] == randNum) { 
       contains = true; 
       break; 
      } 
     } 

     if (!contains) { 
      usednum[selectedCount] = randNum; 
      selectedCount++; 
     } 
    } 


    for (int c = 0; c < usednum.length; c++) { 
     System.out.println(usednum[c]); 
    } 
관련 문제