1
은 우리가 mkStdGen
Int
→ StdGen
및 Int
가고정 비트 수를 가정하지 않고 Int 유형의 시드를 비 직렬화하는 데 충분한 데이터를 읽으려면 어떻게해야합니까?
적어도
[-2^29 .. 2^29-1]
범위와 고정 정밀도 정수형으로 정의 입력이 있는지 주어진다. 주어진 구현의 정확한 범위는Bounded
클래스의minBound
및maxBound
을 사용하여 결정할 수 있습니다.
즉, 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
을 어떻게 구현합니까?
지적하신대로 int는 많은 세부 사항에 달려 있습니다. 왜 아키텍처 독립적 인 작동을하는 발전기를 사용하지 않습니까? 이미 직렬화 형식을 제공 하나? –