java - 还记得随机种子中的位置(?)吗?

标签 java random

首先:我主要是自学成才,所以如果我不知道正确的术语或犯一些菜鸟错误,请原谅我。

所以,我正在用种子创建一个随机变量。当您从变量中获取“下一个”时,它会从该种子中获取下一个值。有什么方法可以将您的位置记录在随机变量中吗?例如,理想情况下,以下代码将输出两个相同的字符串:

//My attempt to save my location in a Random:

r = new Random(5);

for (int i = 0; i < 10; i++) {
    System.out.print(r.nextInt(2));
    if (i == 9) {
        System.out.print(" ");
    }
}

//====================================

System.out.println("\n-------------");
r = new Random(5);
for (int i = 0; i < 5; i++) {
    System.out.print(r.nextInt(2));
}

r = new Random(r.nextLong());
System.out.print(" ");
for (int i = 0; i < 5; i++) {
    System.out.print(r.nextInt(2));
}

而是返回:

1001010100 1100110011
-------------
1001010100 0010010111
-------------

是否有某种方法可以“记住”我的位置,以便我可以创建一个新的随机变量,该变量将在前一个变量停止的地方继续?最好,我不想序列化变量 - 这不会是世界末日,但我想知道是否还有其他方法。

最佳答案

您无法使用一个种子生成 n 个数字,然后使用其他一些种子从上一个系列结束的位置开始。

您可以再次使用相同的种子,并使用流并跳过您之前生成的数字。

第一个列表的最后 5 个值应等于下一个列表的前 5 个值。

        Random r = new Random(23);
        r.ints(10,1,100).forEach(a->System.out.print(a + " " ));
        System.out.println();

        r = new Random(23);

        r.ints(10,1,100).skip(5).forEach(a->System.out.print(a + " "));

您还可以继续使用相同的Random 实例,因为它们不会过期。

       r = new Random(23);

        r.ints(5,1,100).forEach(a -> System.out.print(a + " "));
        r.ints(5,1,100).forEach(a -> System.out.print(a + " "));

当然,如果您想长期保留同一个对象,或者需要生成并跟踪大量随机值,那么序列化可能是最好的解决方案。

关于java - 还记得随机种子中的位置(?)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59793528/

相关文章:

QBasic 中从 0 到 100 的随机数

c++ - 如何在C++中生成随机矩阵?

java - += 和 =+ 有什么区别?

haskell - 如何在haskell中使用带有fmap的随机生成器使用函数?

c# - 如何在随机位置绘制单个 Sprite 10 次?

python - 从包含数字列表的列表中随机创建一组 2 个数字

java - 将 0 更改为 1 的最优雅方式,反之亦然

Java HashMap 覆盖以前的值

java - 为什么我正在读取的文件中添加了更多行到数组列表中?

java - 将业务规则存储在 XML 文档中,然后在 Java 中验证,如何?