gpt4 book ai didi

java - 如何获取 Random.nextLong 可返回的所有可能值?

转载 作者:行者123 更新时间:2023-12-03 11:19:33 26 4
gpt4 key购买 nike

Random#nextLong()文档说明此方法不会返回所有可能的 long值(value)观:
从这个随机数生成器的序列中返回下一个伪随机、均匀分布的 long 值。 nextLong的总承包契约(Contract)是一个长值是伪随机生成并返回的。方法nextLong由类 Random 实现,就像通过:

public long nextLong() {
return ((long) next(32) << 32) + next(32);
}
因为类 Random 使用只有 48 位的种子, 此算法不会返回所有可能的长值 .
例如,数字 8090327796378429294是可生成的,但数字 8090327796378429295不是,尽管它们的唯一区别是一个最低有效位,并且值本身是 63 位长。
有一种方法可以知道 nextLong() 是否可以返回一个值使用以下算法:
public class JavaRandom {
private static final long ADD = 0xBL;
private static final long MULT = 0x5DEECE66DL;
private static final long TWO16 = 1L << 16;
private static final long MASK_31 = (1L << 31) - 1;
private static final long MASK_32 = (1L << 32) - 1;
private static final long MASK_48 = (1L << 48) - 1;

public static boolean canBeGeneratedByJavaRandom(long randomValue) {
long i1 = (randomValue >> 32) & MASK_32;
long i2 = (randomValue & MASK_32);
if (i2 > MASK_31) {
i1 = i1 + 1;
}

long front = i1 << 16;
for (long i = 0; i < TWO16; i++) {
long seed = front | i;
long i22 = (((seed * MULT) + ADD) & MASK_48) >> 16;
if (i22 == i2) {
return true;
}
}

return false;
}
}
如何获取 nextLong() 可以生成的所有值不对每个可能的 64 位数字运行此检查?调用 nextLong()在收集所有值之前感觉不合理,并且可能存在冲突。

最佳答案

鉴于 setSeed 函数完全使用传入值的低 48 位来设置种子,您可以简单地遍历所有 seed来自 0 的值至(1L << 48) - 1 , setSeed给他们每个人,然后调用nextLong()每个种子一次。
更多信息:

  • This answer指出可以从 2 个连续的 nextInt() 中确定种子。值,因此没有两个不同的种子生成相同的 2 个连续 nextInt()值(value)观。
  • 文档指出 nextInt()来电next(32) , 和 nextLong()获得 2 个连续 next(32) 的值值(value)观。

  • 从以上两点来看,不同的种子值会产生不同的 nextLong()值(value)观。

    关于java - 如何获取 Random.nextLong 可返回的所有可能值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65910868/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com