Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(90)

Unified Diff: tests/lib/math/random_test.dart

Issue 156533002: Add more complex mixing of random seed. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/lib/math/random_test.dart
diff --git a/tests/lib/math/random_test.dart b/tests/lib/math/random_test.dart
index 28cf084714bf912fe09981aa6434e07726d8e821..f769efb793e691f69c13232324e0ad58d3b55ab2 100644
--- a/tests/lib/math/random_test.dart
+++ b/tests/lib/math/random_test.dart
@@ -11,50 +11,91 @@ import "package:expect/expect.dart";
import 'dart:math';
main() {
+ checkSequence();
+ checkSeed();
+}
+
+void checkSequence() {
+ // Check the sequence of numbers generated by the random generator for a seed
+ // doesn't change unintendedly, and it agrees between implementations.
var rnd = new Random(20130307);
// Make sure we do not break the random number generation.
// If the random algorithm changes, make sure both the VM and dart2js
// generate the same new sequence.
var i = 1;
- Expect.equals( 1, rnd.nextInt(i *= 2));
- Expect.equals( 1, rnd.nextInt(i *= 2));
+ Expect.equals( 0, rnd.nextInt(i *= 2));
+ Expect.equals( 3, rnd.nextInt(i *= 2));
Expect.equals( 7, rnd.nextInt(i *= 2));
- Expect.equals( 6, rnd.nextInt(i *= 2));
- Expect.equals( 6, rnd.nextInt(i *= 2));
- Expect.equals( 59, rnd.nextInt(i *= 2));
- Expect.equals( 11, rnd.nextInt(i *= 2));
- Expect.equals( 212, rnd.nextInt(i *= 2));
+ Expect.equals( 5, rnd.nextInt(i *= 2));
+ Expect.equals( 29, rnd.nextInt(i *= 2));
Expect.equals( 17, rnd.nextInt(i *= 2));
- Expect.equals( 507, rnd.nextInt(i *= 2));
- Expect.equals( 1060, rnd.nextInt(i *= 2));
- Expect.equals( 891, rnd.nextInt(i *= 2));
- Expect.equals( 1534, rnd.nextInt(i *= 2));
- Expect.equals( 8404, rnd.nextInt(i *= 2));
- Expect.equals( 13839, rnd.nextInt(i *= 2));
- Expect.equals( 23298, rnd.nextInt(i *= 2));
- Expect.equals( 53622, rnd.nextInt(i *= 2));
- Expect.equals( 205997, rnd.nextInt(i *= 2));
- Expect.equals( 393823, rnd.nextInt(i *= 2));
- Expect.equals( 514614, rnd.nextInt(i *= 2));
- Expect.equals( 233715, rnd.nextInt(i *= 2));
- Expect.equals( 895357, rnd.nextInt(i *= 2));
- Expect.equals( 4726185, rnd.nextInt(i *= 2));
- Expect.equals( 7976427, rnd.nextInt(i *= 2));
- Expect.equals( 31792146, rnd.nextInt(i *= 2));
- Expect.equals( 35563210, rnd.nextInt(i *= 2));
- Expect.equals( 113261265, rnd.nextInt(i *= 2));
- Expect.equals( 205117298, rnd.nextInt(i *= 2));
- Expect.equals( 447729735, rnd.nextInt(i *= 2));
- Expect.equals(1072507596, rnd.nextInt(i *= 2));
- Expect.equals(2134030067, rnd.nextInt(i *= 2));
- Expect.equals( 721180690, rnd.nextInt(i *= 2));
+ Expect.equals( 104, rnd.nextInt(i *= 2));
+ Expect.equals( 199, rnd.nextInt(i *= 2));
+ Expect.equals( 408, rnd.nextInt(i *= 2));
+ Expect.equals( 362, rnd.nextInt(i *= 2));
+ Expect.equals( 995, rnd.nextInt(i *= 2));
+ Expect.equals( 2561, rnd.nextInt(i *= 2));
+ Expect.equals( 2548, rnd.nextInt(i *= 2));
+ Expect.equals( 9553, rnd.nextInt(i *= 2));
+ Expect.equals( 2628, rnd.nextInt(i *= 2));
+ Expect.equals( 42376, rnd.nextInt(i *= 2));
+ Expect.equals( 101848, rnd.nextInt(i *= 2));
+ Expect.equals( 85153, rnd.nextInt(i *= 2));
+ Expect.equals( 495595, rnd.nextInt(i *= 2));
+ Expect.equals( 647122, rnd.nextInt(i *= 2));
+ Expect.equals( 793546, rnd.nextInt(i *= 2));
+ Expect.equals( 1073343, rnd.nextInt(i *= 2));
+ Expect.equals( 4479969, rnd.nextInt(i *= 2));
+ Expect.equals( 9680425, rnd.nextInt(i *= 2));
+ Expect.equals( 28460171, rnd.nextInt(i *= 2));
+ Expect.equals( 49481738, rnd.nextInt(i *= 2));
+ Expect.equals( 9878974, rnd.nextInt(i *= 2));
+ Expect.equals( 132552472, rnd.nextInt(i *= 2));
+ Expect.equals( 210267283, rnd.nextInt(i *= 2));
+ Expect.equals( 125422442, rnd.nextInt(i *= 2));
+ Expect.equals( 226275094, rnd.nextInt(i *= 2));
+ Expect.equals(1639629168, rnd.nextInt(i *= 2));
Expect.equals(0x100000000, i);
// If max is too large expect an ArgumentError.
Expect.throws(() => rnd.nextInt(i + 1), (e) => e is ArgumentError);
rnd = new Random(6790);
- Expect.approxEquals(0.7360144236, rnd.nextDouble());
- Expect.approxEquals(0.3292339731, rnd.nextDouble());
- Expect.approxEquals(0.3489622548, rnd.nextDouble());
- Expect.approxEquals(0.9815975892, rnd.nextDouble());
+ Expect.approxEquals(0.1202733131, rnd.nextDouble());
+ Expect.approxEquals(0.5554054805, rnd.nextDouble());
+ Expect.approxEquals(0.0385160727, rnd.nextDouble());
+ Expect.approxEquals(0.2836345217, rnd.nextDouble());
+}
+
+void checkSeed() {
+ // Check that various seeds generate the expected first values.
+ // 53 significant bits, so the number is representable in JS.
+ var rawSeed = 0x19a32c640e1d71;
+ var expectations = [
+ 26007, 43006, 46458, 18610, 16413, 50455, 2164, 47399, 8859, 9732,
+ 20367, 33935, 54549, 54913, 4819, 24198, 49353, 22277, 51852, 35959,
+ 45347, 12100, 10136, 22372, 15293, 20066, 1351, 49030, 64845, 12793,
+ 50916, 55784, 43170, 27653, 34696, 1492, 50255, 9597, 45929, 2874,
+ 27629, 53084, 36064, 42140, 32016, 41751, 13967, 20516, 578, 16773,
+ 53064, 14814, 22737, 48846, 45147, 10205, 56584, 63711, 44128, 21099,
+ 47966, 35471, 39576, 1141, 45716, 54940, 57406, 15437, 31721, 35044,
+ 28136, 39797, 50801, 22184, 58686
+ ];
+ var negative_seed_expectations = [
+ 12170, 42844, 39228, 64032, 29046, 57572, 8453, 52224, 27060, 28454,
+ 20510, 28804, 59221, 53422, 11047, 50864, 33997, 19611, 1250, 65088,
+ 19690, 11396, 20, 48867, 44862, 47129, 58724, 13325, 50005, 33320,
+ 16523, 4740, 63721, 63272, 30545, 51403, 35845, 3943, 31850, 23148,
+ 26307, 1724, 29281, 39988, 43653, 48012, 43810, 16755, 13105, 25325,
+ 32648, 19958, 38838, 8322, 3421, 28624, 17269, 45385, 50680, 1696,
+ 26088, 2787, 48566, 34357, 27731, 51764, 8455, 16498, 59721, 59568,
+ 46333, 7935, 51459, 36766, 50711
+ ];
+ for (var i = 0, m = 1; i < 75; i++) {
+ Expect.equals(expectations[i], new Random(rawSeed * m).nextInt(65536));
+ Expect.equals(negative_seed_expectations[i],
+ new Random(rawSeed * -m).nextInt(65536));
+ m *= 2;
+ }
+ // And test zero seed too.
+ Expect.equals(21391, new Random(0).nextInt(65536));
}
« sdk/lib/_internal/lib/math_patch.dart ('K') | « sdk/lib/_internal/lib/math_patch.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698