2014-10-14 6 views
-2

생성 :임의의 두 정수 나는 다음과 같은 세트에서 임의의 숫자를 선택할 수있는 방법

  • 배정 밀도 부동 소수점 숫자로 정확하게 표현할 수있는 모든 양의 정수 (즉, 자바 double).

내 특정 유스 케이스에 배포

을, 나는 균일 한 분포를 필요가 없습니다. 그러나 저는 그러한 해결책에 학문적으로 관심이 있습니다. 또한 제복은 (적어도) 2 가지 다른 방식으로 해석 될 수 있습니다.

  • 분포는 [0, Double.MAX_VALUE]에서 동일합니다.
  • 각 가능한 값을 선택할 확률은 같습니다.
+2

시도한 코드는 어디에 있습니까? –

+1

정확히 무엇을 의미합니까? –

+1

정확히 '배정 밀도 부동 소수점 수'로 무엇을 의미합니까? –

답변

2

두 배가 64 비트라면 8 바이트의 무작위성을 생성하고 NIO를 사용하여 해당하는 두 배를 얻을 수 있습니다. 이것은 전체 범위를 제공해야한다고 생각하지만 ... 균일 한 분포를 생성하지는 않습니다. 복식이 double 64 binary layout 보면 자바로 표현하는 방법을 나 자신을 생각 나게했습니다

Random random = new Random(); 
byte[] buffer = new byte[8]; 
random.nextBytes(buffer); 

System.out.println(Math.abs(Math.round(ByteBuffer.wrap(buffer).getDouble()))); 

, 지수 11 비트와 분수에 대한 52 비트가 있습니다. 나는 균일 한 분포를 제공하는 대답은 매우 까다로울 것이라고 생각한다.

+0

나는 그런 것을 생각했다. 물론, 'round'와 'abs'를 적용하여 양의 정수로 만들어야합니다. 나는 그 분포가 매우 균일 할 것이라고 생각하지 않는다. 그것은 현재의 유스 케이스에서는 문제가되지 않지만 내부에서는 완벽 주의자에게 상처를줍니다. –

+0

스펙을 공부하면. IEEE 754의 경우이를 내 접근 방식과 결합 할 수 있습니다 ... http://en.wikipedia.org/wiki/IEEE_floating_point – Adam

+1

+1 결과 분포가 균일하지 않다는 사실을 언급합니다. – Bathsheba

0

나는 다음의 테스트되지 않은 방법들을 생각해 보았다.

분포는 [0, Double.MAX_VALUE]에서 동일합니다.

  • 0에서 만들어 Double.MAX_VALUE (here) 사이의 임의의 생성 BigInteger.
  • doubleValue()

을 각각의 가능한 값 따기 확률이 동일 적용된다.

  • 64 비트 버퍼를 만듭니다.
  • 부호를 양수로 설정하십시오.
  • 1에서 1023 사이의 지수를 임의로 설정하십시오.
  • 임의의 비트로 나머지 (분수)를 채 웁니다.
  • 숫자가 정규화되지 않은 경우 (예 : 200 * 2, 정규화 된 버전이 400 * 1 인 경우) 버리고 다시 시도하십시오.