【问题标题】:How to transform any 64-bit integer to a uniformly distributed random number in certain interval如何将任何 64 位整数转换为一定间隔内均匀分布的随机数
【发布时间】:2014-02-06 01:00:50
【问题描述】:

我可以将 [Long.MIN_VALUE, Long.MAX_VALUE] 到 [0,1] 之间的整数均匀随机地转换吗?主要目的是让我可以选择一个分数,例如0.1 并选择均匀且随机分布的 10% 多头。如果这个转换方法是f(x),我可以在任意一个long上检查f(x)< 0.1,看它是否属于10%的选定数字。一些重要的要求:

  • 它可以通过种子来控制,这样我每次(我想要的时候)都可以得到相同的结果,也可以改变种子以获得完全不同的结果。

  • 当我将分数从x增加到y时,我希望x中所有选择的数字也被选择在Y中。例如,如果我选择10%的数字时选择了894230,那么它也应该被选择我选择 20% 的数字。

  • 我可以选择不会产生明显模式的种子,例如double f(x) { return (x%1000)/1000.0; }

    很高兴拥有(但不是必需的):

  • 我可以使用产生明显模式的虚拟种子(以便在单元测试中看起来很明显)。

我使用 Java,但我不介意用任何可以用 Java 轻松重写的语言来回答

【问题讨论】:

    标签: math random numbers


    【解决方案1】:

    如果这项工作真的只是确定x 是否属于所选整数的集合,那么我相信以下将满足您的前三个要求:

    (long)anyReasonableHashFunction(x ^ seed) < Long.MAX_VALUE * fraction
    

    【讨论】:

    • ^ 是指指数还是按位异或?是否有任何合理的哈希函数在 0 到 Long.MAX_VALUE 之间具有统一的输出?
    • ^ 指异或。任何合理的哈希函数都应该具有导致均匀分布的属性
    【解决方案2】:
    boost::hash<long> hasher;
    
    double f( long x, long seed)
    {
        return hasher( x ^ seed) / (double)std::numeric_limits< long>::max();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 2011-04-04
      • 1970-01-01
      • 2021-12-28
      • 2021-05-26
      相关资源
      最近更新 更多