2014-09-10 2 views
0

나는 자바 코드의 간단한 비트를 반복하지 않고 임의의 순서로 1-6 개의 숫자로 추출하려고한다. 저는 1에서 6 사이의 6 개의 무작위 정수를 뱉어 낼 수있었습니다.하지만 숫자가 한 번만 사용되는지 확인합니다. 코드는 다음과 같습니다.자바에서 반복되지 않는 임의의 정수

import java.util.Random; 

public class kirbyInt 

{ 

    public static void main(String[] args) 
    { 
     int num1, num2, num3, num4, num5, num6; 


     Random rand = new Random(); 

     num1 = rand.nextInt((6-1) + 1) + 1; 
     System.out.println(num1); 

     num2 = rand.nextInt((6-1) + 1) + 1; 

     if (num2 == num1) 
     { 
      num2 = rand.nextInt((6-1) + 1) + 1; 
      System.out.println(num2); 
     } 
     else 
     { 
      System.out.println(num2); 
     } 

     num3 = rand.nextInt((6-1) + 1) + 1; 

     if (num3 == num1 || num3 == num2) 
     { 
      num3 = rand.nextInt((6-1) + 1) + 1; 
      System.out.println(num3); 
     } 
     else 
     { 
      System.out.println(num3); 
     } 

     num4 = rand.nextInt((6-1) + 1) + 1; 

     if (num4 == num1 || num4 == num2 || num4 == num3) 
     { 
      num4 = rand.nextInt((6-1) + 1) + 1; 
      System.out.println(num4); 
     } 
     else 
     { 
      System.out.println(num4); 
     } 

     num5 = rand.nextInt((6-1) + 1) + 1; 
     if (num5 == num1 || num5 == num2 || num5 == num3 || num5 == num4) 
     { 
      num5 = rand.nextInt((6-1) + 1) + 1; 
      System.out.println(num5); 
     } 
     else 
     { 
      System.out.println(num5); 
     } 

     num6 = rand.nextInt((6-1) + 1) + 1; 
     if (num6 == num1 || num6 == num2 || num6 == num3 || num6 == num4 || num6 == num5) 
     { 
      num6 = rand.nextInt((6-1) + 1) + 1; 
      System.out.println(num6); 
     } 
     else 
     { 
      System.out.println(num6); 
     } 

    } 

} 
+0

로 할 수있는 당신이 사용할 수있는 DO-동안 당신의 조건에 일치 할 때까지 루프 대신하는 경우의이 새로운 번호를 생성합니다. 그러나 실제로 배열을 사용하거나이를 설정해야합니다. –

+0

배열 등을 사용할 수 없습니까? 반복되는 코드가 너무 많으면 문제를 단순화 할 수 있습니다. –

+0

또한 (6-1) +1 == 6 – JSlain

답변

2

숫자를 ArrayList에 넣을 수 있습니다. 그런 다음 0-5 사이의 임의의 숫자를 가져 와서 인쇄 한 다음 ArrayList에서 그 위치의 숫자를 제거하십시오. 그것은 단지 5 개의 숫자 만 남기고, 0-4 사이의 다음 임의의 숫자를 얻고, 그 임의의 색인에서 숫자를 인쇄하고 제거합니다. 그래서 등등 하나만 가지고 인쇄하면됩니다.

1

이 문제에 접근하는 간단한 방법이 있습니다. 당신이하고 싶은 것을 정확하게 다시 말해 봅시다.

문제점 당신은 주어진 수 k에 대한 임의의 숫자를 유지하는 Set 만들기 이전 k-1 번호

에 솔루션

없는 경우 n 난수를 생성 할

, 당신을 새로운 것을 만들고, 그것을 Set에 아직 없으면 세트에 추가하십시오. 그렇지 않으면 새로운 난수를 생성하고 반복하십시오.

코드 예

import java.lang.String; 
import java.util.Random; 
import java.util.Set; 
import java.util.HashSet; 

public class RandomNum { 

    public static final void main(String[] args){ 
     final Random r = new Random(); 
     final Set<Integer> s = new HashSet<>(); 
     for(int i = 0; i < 6; i++){ 
       while(true) { 
       int num = r.nextInt(6) + 1; 
       if (s.contains(num) == false) { 
        s.add(num); 
        System.out.println(num); 
        break; 
       } 
      } 
     } 
    } 
} 

출력

/tmp$ javac RandomNum.java 
/tmp$ java RandomNum 
5 
1 
3 
2 
4 
6 

다른 옵션은 같은 List로 생성 된 난수를 개최하기 위해 다른 데이터 구조를 사용할 수 원칙적으로

. Set은 6 개 이상의 값을 생성하려는 경우 비교적 빠르게 검색 할 수 있다는 장점이 있습니다. ArrayList으로 비슷한 성능을 얻을 수 있습니다. 그러나 Set을 사용하면 한 가지 더 중요한 이점이 있습니다. 이는 의도 한 바의 의미를 반영합니다 (반복되지 않은 반복되지 않는 값 집합). 컬렉션의 순서에 상관없이 은 중복 값을 원하지 않습니다. A List은 정렬 된 값 모음이며 Set은 정렬되지 않은 값 집합입니다. 즉, Set에 요소를 복제 할 수 없으며 요소가 Set에 추가 된 시점과 관련이 없습니다. 코딩 할 때 거의 항상 이 아닌 데이터 구조를 선택하는 것이 좋습니다. 그러나 의미는 입니다. 의미는입니다.

1

작은 질문 : rand.nextInt(6) 대신에 rand.nextInt((6-1) + 1)을 사용하는 이유는 무엇입니까?

지금 당장의 작업에 대해 : 나는 가능한 숫자의 목록에서부터 시작합니다. 목록에서 기존 색인 중 하나를 무작위로 선택합니다 (결과는 해당 색인의 번호 임). 목록에서 번호를 제거하십시오. 목록이 비어 있으면 더 이상 번호를 사용할 수 없습니다.

좋은 해결책은 이미 사용되지 않은 것을 찾을 때까지 여러 번 임의의 숫자를 다시 생성 할 필요가 없다는 것입니다.

Exemple 코드 :

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

public class Main { 

    public static void main(String[] args) { 
     final List<Integer> integers = new ArrayList<>(); 
     final Random rand = new Random(); 

     // Fill list 
     for (int i = 1; i <= 6; i++) { 
      integers.add(i); 
     } 

     // Take numbers in random order 
     while (!integers.isEmpty()) { 
      final int index; 
      if (integers.size() > 1) { 
       index = rand.nextInt(integers.size() - 1); 
      } else { 
       // rand.nextInt(0) would throw an exception rather than return 0 
       index = 0; 
      } 
      final int result = integers.remove(index); 
      System.out.println("Result: " + result); 
     } 
    } 
} 
0

당신은

public class NonRepreatedRandomNumbers { 

    public static void main(String[] args) { 
     ArrayList myList = new ArrayList(); 
     Random rd = new Random(); 
     int num; 
     while(true){ 
      num = rd.nextInt(6) + 1; 
      if(myList.size() == 6) 
       break; 
      if(!myList.contains(num)){ 
       myList.add(num); 
       System.out.println(myList); 
      }else 
       continue; 
     } 
    } 
} 
관련 문제