Math 如何将任意64位整数在一定间隔内转换为均匀分布的随机数

Math 如何将任意64位整数在一定间隔内转换为均匀分布的随机数,math,random,numbers,Math,Random,Numbers,我可以将[Long.MIN_值,Long.MAX_值]与[0,1]之间的整数进行统一和随机转换吗?主要目的是让我可以选择一个分数,例如0.1,然后选择一个均匀随机分布的10%多头。如果此转换方法是f(x),我可以在任意长度上检查f(x)

我可以将[Long.MIN_值,Long.MAX_值]与[0,1]之间的整数进行统一和随机转换吗?主要目的是让我可以选择一个分数,例如0.1,然后选择一个均匀随机分布的10%多头。如果此转换方法是
f(x)
,我可以在任意长度上检查
f(x)<0.1
,查看它是否属于10%的选定数字。一些重要要求:

(long)anyReasonableHashFunction(x ^ seed) < Long.MAX_VALUE * fraction
  • 它可以由种子控制,这样每次(当我想要的时候)都可以得到相同的结果,并且还可以更改种子以获得完全不同的结果

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

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

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

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


我使用Java,但我不介意使用任何可以用Java轻松重写的语言回答。如果工作真的只是确定
x
是否属于所选整数集,那么我相信以下内容将满足您的前三个要求:

(long)anyReasonableHashFunction(x ^ seed) < Long.MAX_VALUE * fraction
(long)anyreasonalHashFunction(x^seed)
boost::散列哈希器;
双f(长x,长种子)
{
返回哈希(x^seed)/(double)std::numeric_limits::max();
}

是指指数还是按位异或?是否有任何合理的哈希函数具有0到Long之间的统一输出。MAX_值?^指的是XOR。任何合理的哈希函数都应该具有导致均匀分布的属性