2014-04-05 5 views
1
에서

은의 중복으로이 기각하지 마십시오 : 나는 와 난수 발생기를 사용할 필요가 How to generate random positive and negative numbers in java범위 내에서 임의의 숫자 생성. Overlflow없이. 자바

. 그래서 시드를 사용하는 constructor으로 java.util.Random 클래스를 사용했습니다.

Random random = new Random(System.currentTimeMillis()); 

는 그럼

int randomValue = random.nextInt(max - min + 1) + min; 

그러나 상기 스레드에 주어진 용액, 상기 용액에 대한 문제는, 최소 큰 음수이며 경우 최대 큰 양수인지 인 사용 그러면 (max - min + 1) 오버플로가 발생합니다.

더 나은 해결책이 있어야합니다. 아무도 날 가리킬 수 있습니다.

감사합니다.

+1

입니다. – devnull

+0

안녕 devnull, 나는 그것이 왜 중복 정보를 제공하지 않았다. 그 이유는 (최대 - 최소 + 1) 오버플로가 발생할 수 있습니다. – user544192

+0

@devnull : 잘못 입력하지 않는 한 링크 된 응답은 유효한 관심사 인 'Integer.MIN_VALUE' 및'Integer.MAX_VALUE'가 포함 된 가설적인 상황을 만지지 않습니다. –

답변

0

BigInteger을 사용하면 int 오버플로가 발생하지 않습니다. 또한 당신은 (numBits로 지정된 비트까지) 무작위 비트 일부 BigInteger을 만들

new BigInteger(int numBits, Random rnd) 

를 사용할 수 있습니다.

그래서 필요한 비트 수를 계산하십시오 (range.bitLength()이 유용 할 수 있습니다). 임의화된 값이 지정된 범위에 있는지 확인하십시오. 따라서 값이 임의의 범위보다 큰 경우 다시 확인하십시오. 모든 것이 정상이면 min만큼 증가한 무작위 값이 반환됩니다. 여기

당신이 더 많은 정보를 제공 _unless_ 중복, 그것은 참으로, 일부 코드 예제

public static int myRandom(int min, int max, Random r){ 
    if (max <= min) 
     throw new RuntimeException("max value must be greater than min value: max="+max +", min="+min); 

    BigInteger maxB = BigInteger.valueOf(max); 
    BigInteger minB = BigInteger.valueOf(min); 

    BigInteger range = maxB.subtract(minB); 
    do{ 
     BigInteger result = new BigInteger(range.bitLength(), r); 
     if (result.compareTo(range)<=0) 
      return result.add(minB).intValueExact(); 
    }while(true); 
} 
+0

결과 임의 함수는 아마도 균일하지 않을 것입니다. – assylias

+0

@assylias 유니폼 (영어 원어민이 아니므로 /)이 아니라 [BigInteger (int numBits, 임의의 rnd) 생성자]의 설명서에서 볼 수있는 내용을 이해할 수 있는지 잘 모르겠습니다. (http : // docs .alloc/javase/8/docs/api/java/math/BigInteger.html # BigInteger-int-java.util.Random-) "* ... ** 균일하게 ** 0에서 (2^numBits - 1) * "그래서이 코드의 문제점에 대해 더 많이 말할 수 있습니까? 나는 실수를 저질렀나요? – Pshemo

+0

"* 값이 다시 random 범위보다 큰 경우 *"=> 아마 그렇게하면 배포본에 편향을 도입 할 것입니다. 그것은 OP에 대한 문제가되지 않을 수도 있습니다. – assylias

관련 문제