2010-08-10 5 views
0

1부터 37까지 6 개의 고유 난수를 생성해야합니다. 처음에는 간단한 배열 매핑을 사용 :비 균일 랜덤 화자

문제는 (내가 열 적은 다음 그립니다하게 escpicially 경우) 많은 경우에 나는 근처 uniformic 분포를 가지고 있다고했다
private int k=6, n=37; 

public int[] Results() 
{ 
    // fill an array with numbers 1 2 3 . . . n 
    int[] numbers = new int[n]; 
    for (int i = 0; i < numbers.length; i++) 
     numbers[i] = i + 1; 

    // draw k numbers and put them into a second array 
    int result[] = new int[k]; 
    for (int i = 0; i < result.length; i++) 
    { 
     // make a random index between 0 and n - 1 
     int r = (int) (Math.random() * n); 
     // pick the element at the random location 
     result[i] = numbers[r]; 
     // move the last element into the random location 
     numbers[r] = numbers[n - 1]; 
     n--; 
    } 
    return result; 
} 

예 : 1,9,16, 18,24,30 또는 5,16,18,22,26,29

실제 필요한 결과는 다음과 같습니다. 11,16,25,29,30,32 또는 4 , 8,9,15,18,19 그 다음에 10 그립니다.

import java.util.*; 

public class RandomHash 
{ 
    HashMap numbers = new HashMap() ; 
    Random rnd_gen = new Random() ; 

    RandomHash() 
    { 
     for(;;) 
     { 
      int rnd_num = rnd_gen.nextInt() ; 
      Integer rnd_num_obj = new Integer(rnd_num) ; 

      if (! numbers.containsKey(rnd_num_obj)) 
      { 
       numbers.put(rnd_num_obj, rnd_num_obj) ; 
       /* Do whatever with the number */ 
       break ; 
      } /* else loop and get another rnadom num */ 

     } /*end for*/ 
    } 
} 

문제는 내가 현재 각각 6, 32로 랜덤과 해시 맵을 결합하는 방법을 모르겠입니다 :

는 또한 비슷한의 HashMap의 구현을 보았다. 해시 맵이 더 많은 결과를 얻을 수 있습니까?

+1

은 "TRUE 무작위로"숫자를 정의하고 당신이 얻을 출력이 진정으로 무작위되지 않은 이유를 보여줍니다. –

+0

"비 균일"이란 무엇입니까? "비 유니폼"이라는 뜻입니까? 대신에 어떤 배포판이 필요합니까? –

답변

2

난 (초기화 단계 후) 첫 번째 배열을 뒤섞어 상위 6 개 요소를 가져옵니다.

Collections.shuffle(Arrays.asList(array)); 

과 같은 것을 사용하여 언어의 기본 제공 기능으로 배열을 섞을 수 있습니다.

1,000,000 개 요소 중에서 선택하는 경우 성능 문제가 될 수 있지만 37면에서만 셔플 링이 더 명확한 해결책이라고 생각합니다.

+1

그게 32 임의의 번호로 전화를 사용하지 않을까요? 나는 OP가 특별히 10 명 이상을 원했을 것이라고 믿습니다. 사실, 한 번의 전화가 가능합니다. 제 대답을보십시오. –

+0

@ 모론 : 나는 그것을 요구 사항으로 읽고 있지 않습니다. –

+1

"10 회 미만". 나는 이것을 10 번의 무작위 전화로 해석했다. 어쨌든 셔플 링은 훨씬 더 실용적이며 오류가 발생하기 쉽지 않으며 32 자리의 숫자는 아마도 perf/정확도 문제가되지 않을 것입니다. 그래서 +1 :-) –

4

하나의 임의 번호로 전화를 걸 수 있습니다! 10은 9 개가 너무 많습니다. :-)

6 개의 숫자에 대해 정확히 37 가지 가능성을 선택할 수 있습니다.

그래서 1에서 2324784 사이의 임의의 숫자를 선택하면됩니다 (37은 6이됩니다).

그런 다음 매핑을 사용하여 6 개 요소의 상호 조합을 가져옵니다. 매핑 예는 Generating the mth Lexicographical Element of a Mathematical Combination을 참조하십시오. 은 MSDN 코드의

자바 포트는 여기에 있습니다 : http://the-lost-beauty.blogspot.com/2010/07/generating-combinations-in.html

+0

안녕하세요,이 코드의 Java 구현에 도움이 필요합니다. C#에서 너무 많은 불일치가 있습니다. -/ – Roey

+0

@Roey : Java 코드에 대한 링크를 추가하기위한 답을 편집했습니다. –

+0

THNX ALOT Moron (- : – Roey

3

당신은 임의의 숫자를 요구하고 당신이 무엇을 얻을 수 있습니다. 두 가지 예 : 11,16,25,29,30,32 및 4,8,9,15,18,19는 균등하게 분배 된 것으로 생각되는 결과보다 가능성이 적습니다.

예를 들어 마지막 결과를보고 단순화하기 위해 모든 숫자가 19보다 작거나 같을 것으로 기대한다고합시다. 1에서 32 사이의 단일 숫자를 선택하면 19/32 확률 (appr 59 %)로 19 이하이다. 1에서 32 사이의 6 개의 다른 숫자를 선택하면이 숫자가 모두 19 이하일 확률은 3 % 미만입니다.100 번 코드를 실행하는 경우

, 나는 실제로 통계적으로 예상보다 두 더 요구 사항을 충족 다섯 개 목록을 가지고 :

[3, 8, 13, 16, 18, 19]

[ 2, 3, 6, 8, 10, 14]

[2, 6, 7, 8, 13, 18]

[4, 5, 9, 10, 11, 12]

[8, 12, 13, 15, 16, 17]

0

선형 합동 생성기 모듈로 37, 적절하게 선택된 파라미터?

또는

,이 숫자는 객체 []가 될 것으로 기대하고 다른 목적]을 반환

List l = Arrays.asList(numbers); 
Collections.shuffle(l); 
return l.subList(0,k).toArray(); 

참고.

+0

안녕하세요. tC, 내 코드에서 구현하는 방법/위치는 어디입니까? THKX THNX – Roey

+0

http://tinyurl.com/2coyye4 –

0

여기에 비 균일 분배의 :

return new int[]{1,2,3,4,5,6};