当前位置: 首页 > 知识库问答 >
问题:

如何获得可随机返回的所有可能值。下一段时间?

诸经略
2023-03-14

Random#nextLong()文档指出,此方法不会返回所有可能的长值:

返回此随机数生成器序列中的下一个伪随机、均匀分布的long值。nextLong的一般约定是伪随机生成并返回一个long值。方法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;
    }
}

如果不对每个可能的64位数字运行此检查,如何获取nextLong()可以生成的所有值?调用nextLong()直到收集到所有值感觉不合理,也可能存在冲突。

共有1个答案

孔嘉茂
2023-03-14

如果设置种子功能完全使用传入值的较低48位来设置种子,您可以简单地迭代从0到1的所有种子值

更多信息:

  • 这个答案指出,可以从2个连续的nextInt()值中确定种子,因此没有两个不同的种子生成相同的2个连续的nextInt()

从上面两点来看,不同的种子值会生成不同的nextLong()值。

 类似资料:
  • 我有一个随机二叉树,形式如下 12个 13,14 29, 26, 89 每个节点有两个子节点,即(12- 树的分类 根左=树(13) 根右=树(14) 根正当左=树(26) 根左边右=树(26) 根左边左=树(29) 根正当右=树(86)

  • 我有下表: 对于两组中的每一组,我想返回所有可能的值组合。对于组1,例如,可能的组合是(A, B)、(A, C)、(A, D)、(B, C)、(B, D)、(C, D)、(A, B, C)、(B, D, C)、(C, A, B)。类似地,对于组2,它是(A, B)、(A, C)、(B, C)[备注:我不想考虑(1)只有一个值的组合,(2)所有值的组合和(3)没有值的组合。因此,对于n个不同的值,我

  • 问题内容: 我已经阅读/尝试了很多关于SO的建议答案,但没有一个能解决问题 如何获得所有可能的组合? 预期产量: 注意:我要寻找的答案应包括 所有组合和所有不同的安排 。例如: ‘Alpha Beta’ 和 ‘Beta Alpha’ 是2个不同的字符串,并且都应位于输出数组中。 提前致谢 问题答案: 我相信您的教授会更满意此解决方案: 这解决了它:

  • 我试图解决这个问题: 有一个包含r行和c列的网格。坐在左上角牢房里的机器人只能向两个方向移动,右下。但某些细胞必须避免,机器人不能踩到它们。从左上角到右下角为机器人找到一条路径。 这个问题特别需要一条路径,这似乎是直截了当的: 将网格设置为,我得到的伪代码是 尽管我想知道如何获得所有可能的路径(不仅是计数,还有路径值)。注意,它有r行和c列,所以它不是nxn网格。我试图想出一个DP/递归的解决方案

  • 问题内容: 如果我做对了,确定何时编译源代码。 为了更好地支持多种操作系统,我对可能的功能很感兴趣。 当然,由于Go是开源的,因此可能存在无限的可能性。因此,我真正想要的是一个“通用列表”。 已知值为: 或或?我知道其中至少必须存在一个。 问题答案: 请注意,这些值在中定义。 随着围棋1.5(Q3 2015年),将成为 很多 更加完整。 见提交1eebb91由Minux马() :为 所有 通用架构

  • 从以下对象 其中 null 将是 我如何实现