-
Bug
-
Resolution: Fixed
-
P3
-
8-repo-lambda
Constructor SplittableRandom(long) specifies:
"SplittableRandom instances created with the same seed in the same program generate identical sequences of values."
Implementation does not conform to this assertion when consuming parallel version of a sized stream which contains pseudo random values.
Please see the following code sample:
-------------------------------------------------------
// identical
System.out.println("Sequential: ");
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).toArray()));
SplittableRandom splittableRandom = new SplittableRandom(0);
System.out.println("[" + splittableRandom.nextInt() + ", " + splittableRandom.nextInt() + ", " + splittableRandom.nextInt() + "]");
// identical but different from sequential stream
System.out.println("Parallel toArray():");
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).parallel().toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).parallel().toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).parallel().toArray()));
System.out.println("Parallel forEach():");
new SplittableRandom(0).ints(3).parallel().forEach((value) -> System.out.print(value + ", "));
System.out.println();
new SplittableRandom(0).ints(3).parallel().forEach((value) -> System.out.print(value + ", "));
System.out.println();
System.out.println("Parallel iterator():");
PrimitiveIterator.OfInt iterator = new SplittableRandom(0).ints(3).parallel().iterator();
System.out.println("[" + iterator.next() + ", " + iterator.next() + ", " + iterator.next() + "]");
-------------------------------------------------------
The output will be like:
Sequential:
[-720254151, -1440508302, -800994831]
[-720254151, -1440508302, -800994831]
[-720254151, -1440508302, -800994831]
[-720254151, -1440508302, -800994831]
Parallel toArray():
[-413681818, 352542945, -800994831]
[-413681818, 352542945, -800994831]
[-413681818, 352542945, -800994831]
Parallel forEach():
-800994831, 352542945, -413681818,
352542945, -800994831, -413681818,
Parallel iterator():
[-720254151, -1440508302, -800994831]
One problem is that parallel version of the stream produces values different than the golden sequence for a particular seed. If this is expected it needs to be specified more explicitly.
Another problem is that parallel stream produces different values for different types of stream consumption.
The following tests will fail due to this:
api/java_util/SplittableRandom/index.html#IntsSized[checkParallel]
api/java_util/SplittableRandom/index.html#LongsSized[checkParallel]
"SplittableRandom instances created with the same seed in the same program generate identical sequences of values."
Implementation does not conform to this assertion when consuming parallel version of a sized stream which contains pseudo random values.
Please see the following code sample:
-------------------------------------------------------
// identical
System.out.println("Sequential: ");
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).toArray()));
SplittableRandom splittableRandom = new SplittableRandom(0);
System.out.println("[" + splittableRandom.nextInt() + ", " + splittableRandom.nextInt() + ", " + splittableRandom.nextInt() + "]");
// identical but different from sequential stream
System.out.println("Parallel toArray():");
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).parallel().toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).parallel().toArray()));
System.out.println(Arrays.toString(new SplittableRandom(0).ints(3).parallel().toArray()));
System.out.println("Parallel forEach():");
new SplittableRandom(0).ints(3).parallel().forEach((value) -> System.out.print(value + ", "));
System.out.println();
new SplittableRandom(0).ints(3).parallel().forEach((value) -> System.out.print(value + ", "));
System.out.println();
System.out.println("Parallel iterator():");
PrimitiveIterator.OfInt iterator = new SplittableRandom(0).ints(3).parallel().iterator();
System.out.println("[" + iterator.next() + ", " + iterator.next() + ", " + iterator.next() + "]");
-------------------------------------------------------
The output will be like:
Sequential:
[-720254151, -1440508302, -800994831]
[-720254151, -1440508302, -800994831]
[-720254151, -1440508302, -800994831]
[-720254151, -1440508302, -800994831]
Parallel toArray():
[-413681818, 352542945, -800994831]
[-413681818, 352542945, -800994831]
[-413681818, 352542945, -800994831]
Parallel forEach():
-800994831, 352542945, -413681818,
352542945, -800994831, -413681818,
Parallel iterator():
[-720254151, -1440508302, -800994831]
One problem is that parallel version of the stream produces values different than the golden sequence for a particular seed. If this is expected it needs to be specified more explicitly.
Another problem is that parallel stream produces different values for different types of stream consumption.
The following tests will fail due to this:
api/java_util/SplittableRandom/index.html#IntsSized[checkParallel]
api/java_util/SplittableRandom/index.html#LongsSized[checkParallel]
- relates to
-
JDK-8025148 Clarify SplittableRandom spec for generated values from parallel streams
-
- Open
-