gpt4 book ai didi

haskell - randomIO(来自 System.Random)是否会产生 0?

转载 作者:行者123 更新时间:2023-12-03 14:26:30 25 4
gpt4 key购买 nike

我明白 randomIO::IO Float产生均匀分布 Float数字,但我的问题是在什么范围内?是吗[0,1] , (0,1)或介于两者之间的任何内容( [0,1)(0,1] )?

我在 hackage 上找不到任何相关信息,并且引用的论文位于付费专区后面。

我问的原因是因为您可能想要转换随机数,并且如果您想评估 1/myRandomNumber知道您是否会遇到 Infinity 会很有帮助。或不。

import System.Random
main=(randomIO::IO Float)>>=print

Try it online!

最佳答案

简答 :范围是 [0, 1) .

是的。 Random的实现对于 Float[source] :

instance Random Float where
randomR = randomRFloating
random rng =
-- TODO: Faster to just use 'next' IF it generates enough bits of randomness.
case random rng of
(x,rng') ->
-- We use 24 bits of randomness corresponding to the 24 bit significand:
((fromIntegral (mask24 .&. (x::Int32)) :: Float)
/ fromIntegral twoto24, rng')
-- Note, encodeFloat is another option, but I'm not seeing slightly
-- worse performance with the following [2011.06.25]:
-- (encodeFloat rand (-24), rng')
where
mask24 = twoto24 - 1
twoto24 = (2::Int32) ^ (24::Int32)

它使用一个随机的 32 位整数 x (其中零是一个可能的值),它屏蔽掉前 8 位,并将该值除以 224。因此,范围是 0(包括)到 1(排除)。它可以表示的最大值是 0.999999940395 .

这样做的原因是因为 Float有一个 24 位尾数(以及 7 位指数和一个符号位)。通过在该范围内转换它,我们保证每个 Float值同样可能:最后 24 位首先复制到 Float 的尾数中,然后浮点数被归一化,指数改变,使得值在 [0, 1) 范围内。

关于haskell - randomIO(来自 System.Random)是否会产生 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com