首页 > 解决方案 > 从任何数字生成确定性随机数

问题描述

从一个数字 x,我想要一个函数来获得一个随机数 y,均匀分布。对于相同的 x,函数应该返回相同的 y。

我试过了:

float func(int x) {
  return new Random(x).nextFloat();
}

但显然只有种子 Random 提供的数字序列是均匀分布的,而不是第一个值。这可能吗?

标签: javarandom

解决方案


首先,请注意 int 和 float 在 Java 中都是 32 位数据类型。所以你所要求的本质上是一个好的散列函数。如果您希望随机函数为 1:1,那么这将成为伪随机排列。所以选择你最喜欢的哈希函数,然后将这些位重新解释为浮点数(而不是强制转换)

public float f(x) {
   // Pick your favorite hash function here
   int hash = (int)(x * 2654435761L) // Fibonacci hash
   return Float.intBitsToFloat(hash);
}

推荐阅读