2012-03-29 4 views
0

내 문제는 내 프로그램에서 0에서 3 사이의 숫자 범위에서 4 개의 고유 한 임의 선택을 할 수있게하려는 것입니다. 무작위로 시도했지만 시도 할 수 없었습니다. 그것은 잘 될 것입니다 코드, 내 프로그램은 (너무 많은 숫자가 필요하지 않은 경우)이 같은 것을 분명히특정 범위의 고유 난수 선택

my range 

0 1 2 3 randomly chosen number 3 

0 1 2 randomly chosen number 1 

0 2  randomly chosen number 2 

0  it will choose 0 and then the program closes 
+1

작성한 코드를 표시하십시오. –

+1

4 자리 숫자 중 4 자리에서 임의의 숫자 4 개 (교체 없음)를 선택하고 있습니까? 당신은 정말로 무엇을 성취하려고합니까? 숫자 0-3의 시퀀스를 임의로 랜덤 화하려고합니까? –

+0

실제로 함수가 전체 프로그램이 아니며 randomise하려고하지 않습니다. 배열에서 요소를 선택하면 다시 선택하지 않습니다. – ray

답변

0

당신이를 채울 수 0 이르기까지 번호 ArrayList<Integer> 수 있도록하는 것입니다 - 그럼 3. 당신 Random.nextInt(list.size())을 사용하여 무작위 색인을 얻고, 목록에서 번호를 얻고 색인에 removeAt 항목을 가져옵니다.

+0

ArrayList의 removeAt 메서드가 없으므로 일부 코드를 삽입 할 수있었습니다. 감사를 위해 2 시간 노력 감사 – ray

+0

죄송합니다, 그것은 단지'remove (index)'라고합니다. – Neet

+0

다음은 예입니다. http://pastebin.com/ybLcnhYz – Neet

8

0에서 n-1까지 정수의 무작위 순열을 효과적으로 찾고 있습니다.

당신은 다음에, ArrayListn-10에서 숫자를 넣어 그 목록에 Collections.shuffle()를 호출 한 다음 하나를 사용하여 목록 하나에서 숫자를 가져올 수

:

final int n = 4; 
    final ArrayList<Integer> arr = new ArrayList<Integer>(n); 
    for (int i = 0; i < n; i++) { 
     arr.add(i); 
    } 
    Collections.shuffle(arr); 
    for (Integer val : arr) { 
     System.out.println(val); 
    } 

Collectons.shuffle() 보장되는 모든 변경이 발생하는 것을 균등 우도. 원하는 경우

, 당신은 Iterable이 점을 캡슐화 수 : 하나의 특정 실행에

ChooseUnique ch = new ChooseUnique(4); 
    for (int val : ch) { 
     System.out.println(val); 
    } 

:

public class ChooseUnique implements Iterable<Integer> { 

     private final ArrayList<Integer> arr; 

     public ChooseUnique(int n) { 
      arr = new ArrayList<Integer>(n); 
      for (int i = 0; i < n; i++) { 
       arr.add(i); 
      } 
      Collections.shuffle(arr); 
     } 

     public Iterator iterator() { 
      return arr.iterator(); 
     } 
    } 

이 클래스의 인스턴스를 반복, 그것은 임의의 순열을 생산 , 이것은 1 0 2 3를 인쇄했습니다.

+0

감사하지만이 방법으로는 해결되지 않습니다. 셔플은 고유하지 않도록하십시오. – ray

+1

@ray : 사실, 그렇습니다. 모든 수는 최종 목록에서 정확히 한 번 발생합니다. 코드를 실행 해 보셨습니까? – NPE

+1

남자 너무 감사합니다, 많이 고마워요 – ray

0

배열의 유형에 범위가있는 경우 배열의 길이에 무작위를 사용하십시오.

예를 들어, range이라는 int 배열이있는 경우. 그런 다음 사용할 수 있습니다 :

java.utils.Random randomGenarator = new java.utils.Random(); 
return range[randomGenarator.nextInt(range.length)]; 
+0

고유 한 번호가 아닙니다. 감사합니다. – ray

관련 문제