2017-05-19 1 views
1

은 우리가 mkStdGenIntStdGenInt고정 비트 수를 가정하지 않고 Int 유형의 시드를 비 직렬화하는 데 충분한 데이터를 읽으려면 어떻게해야합니까?

적어도 [-2^29 .. 2^29-1] 범위와 고정 정밀도 정수형으로 정의 입력이 있는지 주어진다. 주어진 구현의 정확한 범위는 Bounded 클래스의 minBoundmaxBound을 사용하여 결정할 수 있습니다.

즉, Int은 폭의 고정 된 상한을 갖지 않습니다.

Expert Beginner는 생각 '그러나 GHC는 내 컴퓨터에서 31 비트 Int를 사용합니다! - 사이먼 페이튼 존스 충분히 좋은 사람을 위해 충분해야한다'훌륭한 자기 만족

generator :: IO StdGen 
generator = do 
    withBinaryFile "/dev/urandom" ReadMode $ \h -> do 
    let nbytes = 4 
     buf = take nbytes $ repeat (0::Word8) 
     toInt ws = 
      let [a,b,c,d] = (map fromIntegral ws) :: [Word32] in 
      fromIntegral $ (shiftL (clearBit a 7) 24) .|. 
          (shiftL   b 16) .|. 
          (shiftL   c  8) .|. d 
    withArray buf $ \p -> do 
     nread <- hGetBuf h p nbytes 
     when (nread /= nbytes) $ error "failed read" 
     bytes <- peekArray nbytes p 
     return $ mkStdGen (toInt bytes) 

쓰기 그것은 64 비트 GHC를 확인하기 위해 우리의 영웅 발생하지 않았다

Prelude> maxBound :: Int 
9223372036854775807 
Prelude> 2^63 
9223372036854775808 

또는 그 Int 최소 29 비트가 다른 하스켈.

시드 비트가 낭비되거나 오버 플로우되지 않도록 generator을 어떻게 구현합니까?

+0

지적하신대로 int는 많은 세부 사항에 달려 있습니다. 왜 아키텍처 독립적 인 작동을하는 발전기를 사용하지 않습니까? 이미 직렬화 형식을 제공 하나? –

답변

1

FiniteBits 클래스는 등을 가지고 있습니다.

Data.Bits> finiteBitSize (0 :: Int) 
64 
관련 문제