2013-03-25 9 views
0

숫자 1-4를 무작위로 얻어서 arrayList에 저장해야합니다. 나는 좋은 시작을 가지고 있지만 에뮬레이터가 계속 충돌하기 때문에 무한 루프가 발생할 수 있습니다. 숫자는 두 번 이상 사용할 수 없습니다.안드로이드는 4 개의 난수를 얻습니다.

** lightSelector is a global variable (int lightSelector = 1;) 
** generatedOrder is my ArrayList 

for (int i = 0; i < 4; i++) 
{ 
     lightSelector = 1 + (int)(Math.random() * 4);   
     generatedOrder.add(lightSelector); 
     boolean contains = true; 
     System.out.print(generatedOrder.get(i)); 
     if (!generatedOrder.isEmpty()) 
     { 
      // Loop until a number is generated that hasn't already been picked 
      while (contains) 
      { 
       if (generatedOrder.contains(lightSelector)) 
        lightSelector = 1 + (int)(Math.random() * 4); 
       else 
       { 
        generatedOrder.add(lightSelector); 
        contains = false; 
        break; 
       }  
      } 
     } 
    } 
+0

당신은 로그 캣 출력을 얻을 수 있습니다. 그게 뭐래? –

+0

추적 파일을 열 때 오류가 발생합니다. 해당 파일이나 디렉토리가 없습니다. (2) – Andrew

+0

길어집니다. 약 10-30 행. 빨간색 또는 노란색. 질문에 편집하십시오. –

답변

2

무작위 정렬 위해 네 개의 숫자를 얻기 위해보다 효율적인 방법은 다음과 같은 알고리즘을 수행한다 :

1) 등의 int [] 배열을 만들기를 {1, 2, 3, 4} ;

2) i = 0 인 경우; i < array.length; ++ i, i와 array.length-1 사이의 난수 j를 생성합니다. 을 포함하고 i와 j를 바꿉니다.

중요 : 가능한 스왑은 00,01,02,03 중 하나이고 11,12,13 중 하나 뒤에 22,23 중 하나와 33 중 하나가 뒤따라야 함을 의미합니다. 이로 인해 4 * 3 * 2 * 1 = 4! 배열을 바꾸는 방법은 알고리즘이 올바르다는 데 필요합니다.

(예를 들어, 당신은 알고리즘을 완료하는 4^4 = 256 가지 방법, (24)는 균일하게 256에 가지 않는 등 일부 셔플은 다른 사람보다 나타날 가능성이있을 것입니다.했다 경우) Fisher-Yates Shuffle

편집 :

이 셔플 알고리즘은 이름이 정수 범위에서 난수를 생성하는 좋은 방법은 다음을 수행하는 것입니다

1) Random rng = new Random()를 생성; 정확하게 한 번. 두 개의 무작위 인스턴스를 동시에 만들면 동일한 난수 스트림을 제공하기 때문에 새로운 인스턴스를 만들지 마십시오.

2) Random은 0과 n - 1 사이의 임의의 int를 반환하는 방법 인 nextInt(n)을 가지고 있으므로 i와 j 사이의 난수를 얻으려면 nextInt(j+1-i)+i을 수행하십시오. i와 j 사이에 난수를 얻으려면 j를 제외하고 nextInt(j-i)+i을 사용하십시오.

API 레퍼런스 :이 충돌하는 경우 http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html

+0

난수 j를 생성하려면 최대/최소값을 변경하는 것 외에 lightSelector에 대해 수행 한 것과 동일한 논리를 사용해야합니까? – Andrew

+0

@Andrew 나는 그것을하기를 선호하는 방식으로 나의 대답을 편집했다. – Patashu

+0

고마워요! 나는 그것을 줄 것이다. – Andrew

관련 문제