带种子的随机类

时间:2018-03-20 13:28:05

标签: java random

    long seed = 0;
    Random rand = new Random(seed);
    int rand100 = 0;
    for(int i = 0; i < 100; i++)
        rand100 = rand.nextInt();
    System.out.println(rand100);

我写了这段代码来获得给定种子的第100个随机整数值。我想知道是否有办法获得给定种子的第100个随机整数值而不调用nextInt() 100次。

3 个答案:

答案 0 :(得分:2)

是。只要seed是常量,那么执行此100次的结果将产生相同的结果时间。因此,您可以这样做

int rand100 = -1331702554;

答案 1 :(得分:2)

  

我想知道是否有办法获得nextInt() - 给定种子的随机整数值,不用调用100 100次。

,在没有先生成其他99值的情况下,无法直接获取序列的next个随机数。这仅仅是因为Java中的生成工作原理,这些值取决于它们之前的值。

如果您想详细了解,请查看source code。内部种子随着nextseed = (oldseed * multiplier + addend) & mask; 方法的每次调用而变化,使用前一个种子:

100

因此,为了获得第99个值的种子,您需要知道第98个值的种子,该值需要100的种子 - 价值等等。

但是,您可以使用更简洁的语句(如

)轻松获取long seed = ... int amount = 100; Random rnd = new Random(seed); // Generate sequence of 100 random values, discard 99 and get the last int val = rnd.ints(100).skip(amount - 1).findFirst().orElse(-1); - th值
123

请记住,这仍然会计算所有先前的值,如上所述。它只是丢弃它们。

第一次计算出该值后,您可以将其硬编码到程序中。假设您已对其进行了测试,并产生123。然后,如果种子没有改变,则值始终为int val = 123; 。所以你可以做到

Random

通过JVM的多个实例,序列保持不变,因此该值始终对此种子有效。虽然不知道发布周期,但我认为允许 Public Sub DataGridView1_CellMouseEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellMouseEnter Try Me.DataGridView1.CurrentCell = Me.DataGridView1(DataGridView1.Columns(e.ColumnIndex).DisplayIndex, DataGridView1.Rows(e.RowIndex).Index) Catch End Try End Sub 通过不同版本的Java改变其行为。

答案 2 :(得分:0)

如果我纠正你,你会搜索一些种子方法,比如

int[] giveMeInts(int amount, long seed);

Stream Random的{​​{1}}方法存在非常相似的内容:

long seed  = ...
int amount = 100;

Random rnd = new Random(seed);

IntStream values = rnd.ints(amount);

您可以收集List<Integer>int[]数组等集合中的流值:

List<Integer> values = rnd.ints(amount).collect(Collectors.toList());

int[] values = rnd.ints(amount).toArray();

这些方法将使用Random对象的种子,因此如果使用相同的种子,它们将始终生成相同的值序列。