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次。
答案 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
对象的种子,因此如果使用相同的种子,它们将始终生成相同的值序列。