【问题标题】:Generate a deterministic random number from any number从任何数字生成确定性随机数
【发布时间】:2021-02-11 22:20:38
【问题描述】:

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

我试过了:

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

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

【问题讨论】:

  • 我不关注。从Random 给出的数字总是均匀分布在给定的范围之间。在您的情况下,所有现有浮点数的范围。所以nextFloat() 会给你任何float,所有的机会都差不多。请更准确,并准确地解释你想要什么,可能有例子。
  • 你考虑过使用Object.hashCode()吗?
  • NextFloat() 为您提供从 0 到几乎 1 的浮点数。随机数生成器以 x 为种子。

标签: java random


【解决方案1】:

首先,请注意 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);
}

【讨论】:

  • 感谢您的回答,我想知道如何使 f 返回 [0,1) 范围内的值?对于python,我发现了这个stackoverflow.com/q/40351791/5913493
  • @Martin 从哈希中获得随机整数后,只需将其除以 Integer.MAX_VALUE 即可获得范围 [-1, 1] 内的值。此时加 1 得到 [0, 2] 中的值,除以 2 得到 [0, 1] 中的值
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多