【问题标题】:Remember location(?) in Random seed?还记得随机种子中的位置(?)吗?
【发布时间】:2020-01-17 19:09:41
【问题描述】:

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

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

//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
-------------

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

【问题讨论】:

  • 播种不是这样的。如果你删除r = new Random(r.nextLong()),你会得到同样的结果。
  • 只是好奇为什么你需要继续使用相同的种子,因为无论如何你都会生成新的数字。
  • 我正在寻找一种方法来保存种子中的当前位置,以便保存/重新加载游戏的各种尝试不会产生不同的结果。显而易见的答案是序列化随机变量,但我一直在寻找一种不涉及序列化的方法。

标签: java random


【解决方案1】:

您不能使用一个种子生成 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 + " "));

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

【讨论】:

  • 谢谢 - 这适用于我正在尝试做的事情。我不知道将 intstream 与 skip 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多