2011-02-04 9 views
5

내 프로젝트의 일부로 일련의 숫자를 제공하여 반복되는 2 또는 3 자리 임의의 숫자를 만들어야합니다. 각 함수 호출에 대해 하나의 난수를 얻어야하기 때문에 목록이나 배열을 구현하고 싶지 않습니다.반복되지 않는 임의의 숫자

Java의 SecureRandom 클래스를 사용하여이 작업을 시도했습니다. 일부 사이트에서도 도움을 받았지만 그 사이에 끼어있어 VALUES를 섞어서 끝낼 수 있습니까? 그러나 나는 그것이 어떻게 이루어질 수 있는지 모른다. 누구든지 나를 도울 수 있습니까?

import java.security.SecureRandom; 
public class RandomNumber { 
private static final RandomNumber rnd= new RandomNumber(); 

    private static final char[] VALUES = new char[] { 
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
    private static final SecureRandom srn= new SecureRandom(); 
    public String createID() 
    { 
     byte[] bytes = new byte[3]; 
     srn.nextBytes(bytes); 

    } 
+1

숫자 내에서 반복되지 않아야하는 숫자 또는 결과로 나타나는 2 또는 3 자리 숫자입니까? 당신의 셔플 질문은 전자를 제안하지만 후자는 숙제와 비슷하게 들릴 것입니다. –

+0

후속 번호에서와 같이 반복하지 않는 것은 동일하거나 전 세계적으로 반복하지 않는 것입니까? – biziclop

+0

No..Paul .... 번호 내의 숫자는 반복 될 수 있지만 ... 각 호출에 대해 생성 된 숫자는 고유해야합니다 (예 : 331은 가능하지만 331은 두 번째로 생성되어서는 안됩니다.) 시간 ...) – vidhya

답변

12

Fisher-yates shuffle algorithm입니다. 그것의 효과적인 셔플. 이며 선형 시간으로 작동합니다. 마노의 코드 반복이 값 []보다는 더 높은 사람들의 낮은 요소를 교체 할 가능성이있는 경우 여기

는 너 한테

To shuffle an array a of n elements: 
    for i from n − 1 downto 1 do 
     j ← random integer with 0 ≤ j ≤ i 
     exchange a[j] and a[i] 

하고 코드

for(int i=VALUES.length-1; i>0; i--){ 
      int rand = (int) (Math.random()*i); 
      char temp = VALUES[i]; 
      VALUES[i] = VALUES[rand]; 
      VALUES[rand] = temp; 
    } 
+0

감사합니다 Manoj ...하지만 위의 프로그램의 출력은 배열 .. 좋아 ..? 그러면 어떻게 매 함수 호출마다 단일 값을 얻을 수 있습니까? – vidhya

+0

@vidhya : ~ 1000 개의 가능한 모든 값을 배열에 넣고 셔플하면됩니다. 그런 다음 변수를 유지하여 지금까지 생성 한 숫자의 수를 추적하고 셔플 된 배열에서 다음 숫자를 계속 검색하는 것입니다. –

-2

입니다. 예 : i = 9의 경우 어레이의 모든 구성원 (자체 포함)과 스와핑 할 확률은 1/10입니다. 그런 다음 i = 8에 대해 Math.random() * i는 0에서 8까지만 포함 할 수 있기 때문에 다시 VALUES [9]와 교환 할 수 없습니다. 즉, VALUES [9]는 원래 VALUES [9]보다 더 자주 다른 요소는 각각의 요소와 같을 것입니다 (그리고 점점 작아짐에 따라 교환 될 확률이 증가합니다).

단순히 배열의 요소에 가중치를하지에 위의 대답을 정정하고 싶은 : (당신이 원하는대로 또는 여러 번)

for(int i=0; i <= VALUES.length - 1; i++){ 
     int rand = (int) (Math.random()*(VALUES.length-1)); 
     char temp = VALUES[i]; 
     VALUES[i] = VALUES[rand]; 
     VALUES[rand] = temp; 

이제 셔플이 수행 VALUES.length 시간 및하지 않습니다 배열의 특정 요소를 선호하십시오.

+2

사실 "버그 수정"은 버그를 야기합니다. 이것은 위키피디아의 [토론] (http://en.wikipedia.org/wiki/Fisher-Yates#Implementation_errors)조차도 그런 일반적인 오해입니다. – meriton

관련 문제