【问题标题】:The relationship between bits and int/float random number generatorbits 与 int/float 随机数生成器的关系
【发布时间】:2014-05-21 06:32:25
【问题描述】:

我想弄清楚int或float的位和RNG之间的关系。

(通过随机我的意思是均匀分布)


我得到了一个完美布尔随机发生器,我被要求实现一个随机的 32 位整数发生器(包括负数、零和正数)。我想要做的是为每个 32 位生成一个随机布尔值,并将它们连接在一起成为一个随机整数

我做对了吗?


反过来说,如果给我一个完美随机 32 位整数生成器,我可以说每个位都可以认为是均匀分布在 0 和 1 上吗?


float怎么样(不仅仅是0到1之间,还有全范围的float)?

我可以用同样的方法生成随机 IEEE 745 浮点数吗?

【问题讨论】:

    标签: algorithm random floating-point integer bit


    【解决方案1】:

    是的。这正是random.org 所做的。在这种情况下,域很容易映射——像6 sided die 这样的东西更难。

    【讨论】:

    • 你是说产生一个均匀随机的 6 面骰子结果比产生一个均匀随机的浮点数更难?
    • generating 32 random bits way 可以应用于浮动吗?浮点数的位表示格式与整数不同
    • @PascalCuoq 在 [0,5] 范围内创建一个均匀随机整数,仅使用位生成器确定性地完成并非易事
    • @NiklasB。也许吧,但是生成一个均匀随机的浮点数真的很困难。已接受答案中的解决方案具有微妙或非微妙的偏见。将随机整数除以 2 的幂将是一个好的开始,但需要将 FPU 舍入模式更改为非最接近偶数优先,以避免“偶数”浮点数的偏差。
    • @PascalCuoq 我认为这里的答案只是指整数生成部分。您应该对另一个发表评论
    【解决方案2】:

    是的,你确实做得对,使用 32 次不同数字的抽奖,会给你一个均匀分布的随机变量。

    说明:每个号码都可以通过 32 次 0/1 抽奖的唯一组合生成。同一个组合不会产生 2 个数字,2 个组合不会产生任何数字 - 意思是,每个数字的概率是 1/2^32 - 正如预期的那样。


    是的,同样的原则也适用于此。选择 32 位数字有 2^32 种“方式”,与上一个问题类似 - 您可以看到这些数字独立均匀地分布在每位 {0,1} 上。


    randUnsignedInt()/(2^32-1) 可以生成范围 [0,1] 内的随机均匀分布的浮点数。另一种方法是绘制int 并重新解释它以浮动 - 假设两者都使用相同数量的位数(基本上 - 两者都是 32 位数字,它们仅在您解释它们的方式上有所不同......)请注意替代方案不在 [0,1] 范围内。

    【讨论】:

    • 如果我需要使用完美的布尔随机生成器,我可以用同样的方法来生成浮点数吗?
    • @JacksonTale 如果您想要任何浮点数 - 只需创建一个 int 并将其重新解释为浮点数。但是请注意,由于浮点算术语义,它不是 100% 统一的(在绝对值中,对小数的表示比对大数的表示更多) - 但你可以表示的每个浮点数 - 将具有完全相同的概率生成- 1/2^32.
    • 你能看看我的编辑。好想看看32轮随机boolean能否覆盖整个float范围,并且每个float数是统一生成的。
    • @JacksonTale 您必须为浮动定义“统一”的含义。你的意思是每个 2 个浮点数都有相同的概率被选中吗?或者对于每个a,b,c,d,使得b-a=d-c 的概率(假设为x)在:a<x<b 与它的概率相同:c<x<d。由于浮点表示 - 这两个定义相互矛盾。
    • @JacksonTale 是的,这是我提出的替代方案 - 但请注意,获得x 这样0 <= x <= 1 的概率高于获得这样一个数字 2^30 <= x <= 2^30 + 1,由于到浮点表示 - 根据标准,“小”数字比“大”数字多。但是,每 2 个可能的数字将有相同的概率被选中。
    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2012-03-10
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多