2012-09-11 5 views
0

간단한 질문이 있는데 난수 생성에 조금 녹슬 었습니다. 나는 큰 홀수 정수를 생성하고 싶다. (내 숫자가 int 범위를 벗어날 수 있기 때문에 double을 사용하고있다.) 나는 난수 생성에서 십진수를 없애고 홀수가되는 방법을 알아낼 수 없다.Java에서 임의의 double을 제한합니다.

은 지금은 단지이 : 내가 말했듯이

N = nMin + (nMax - nMin) * rand.nextDouble(); 

나에게 n 분 및 NMAX 사이 (소수점 포함) 임의의 난수를 제공합니다. 어떤 도움을 많이 주시면 감사하겠습니다!

+2

"int 범위 밖"- 'long'외에도? – Mysticial

+0

예, 이중이어야합니다 –

+0

이 경우 아마도 디자인에 문제가있을 것입니다.'long'보다 긴 정수의 균일 한 분포를 생성하는 경우 생성 된 수는 홀수와 짝수를 구별하기 위해 'double'에서 충분히 작고 (따라서 충분히 정확할 확률이 높을 것입니다. 사라지는 작은. – Mysticial

답변

6

(당신이 :-). 자신을 nMinnMax을 조정해야하는 방법 당신은 아마의 수학을 할 수 있습니다) 그, BigInteger.

this question의 정보를 사용하여 임의의 BigInteger을 만들고, 심지어 짝수 인 경우 1을 추가하면됩니다.

BigInteger randomOdd(BigInteger min, BigInteger max) { 
    BigInteger range = max.subtract(min); 

    // expected iterations: 2 - max iterations: infinite 
    BigInteger tmp; 
    do { 
     tmp = new BigInteger(n.bitLength(), rng); // rng is your Random Number Generator 
    } while (tmp.compareTo(range) >= 0); 

    BigInteger result = min.add(tmp); 

    // force the result to be odd 
    // TODO: will this push it over max? 
    result = result.or(BigInteger.ONE); 

    return result; 
} 

또는, BigInteger를 클래스의 메소드를 사용할 수 있습니다 BigInteger.probablePrime()을 :

public static BigInteger probablePrime(int bitLength, Random rnd)

지정된 bitLength으로, 아마 소수 긍정적 인 BigInteger를 돌려줍니다. 이 메소드가 돌려주는 BigInteger가 합성 인 확률은 2^100를 넘지 않습니다.

매개 변수 :

  • 비트 수 - 반환 BigInteger의 비트 수.
  • rnd - 소수성을 테스트 할 후보를 선택하는 데 사용되는 임의 비트의 소스입니다.

결과 :

  • 아마 소수 있다면 아마

소수 비트 수 비트의 BigInteger, 또한 아마 이상한.

+0

나는 그것을 이해한다고 생각한다. 범위를 0 대신 지정된 최소값으로 설정하려면 어떻게해야합니까? –

+0

트릭을 수행해야하는 코드를 추가했거나 적어도 시작해 보았습니다. 나는 잠재적으로 "최대"주변에서 엣지 케이스를 보지만, 버그와 엣지 케이스를 해결하는 것은 그들이 올 때 다루어 질 수있는 것들이라고 확신한다. – corsiKa

+0

'result.or (BigInteger.ONE)'만하면됩니다. – oldrinb

0

소수를 제거하는 것은 일반적인 문제입니다. 한 가지 트릭은 100을 곱한 다음 그 결과를 int (또는 long)로 변환하는 것입니다. 이것은 익숙해지는 좋은 습관입니다!

+0

int 캐스팅을 수행 할 수 없습니다. int 범위를 벗어날 것이라고 그는 말합니다. – corsiKa

1

(long)(expression)expressionlong (64 비트 정수)로 변환하고 소수 자릿수를 잘라서 (따라서 효과적으로 0으로 반올림 됨). 홀수 번호를 만들려면 먼저 정수를 만든 다음 두 개의 숫자를 곱하여 을 곱한 다음 (당황한 편집)을 하나 추가합니다. 당신의 숫자가 INT 범위 밖에있을 수 있다면, 당신은 long를 사용, 또는 실패한다

+2

"홀수 생성은 먼저 정수를 생성 한 다음 두 개를 곱하여 수행 할 수 있습니다." 그게 _even_ 숫자입니다 :) –

+0

홀수에 2를 곱하여 그 홀수에 1을 더하는 것입니다. 두 개의 보장을 짝수로 곱한 다음 하나를 추가하면 홀수가됩니다. – Brian

+0

@martinclayton : 폭발, 나는 너무 피곤해서 - 지금 고쳐야합니다. –

관련 문제