| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| // Test that rnd.nextInt with a seed generates the same sequence each time. | |
| // Library tag to allow Dartium to run the test. | |
| library random_test; | |
| 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(0, rnd.nextInt(i *= 2)); | |
| Expect.equals(3, rnd.nextInt(i *= 2)); | |
| Expect.equals(7, 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(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.throwsArgumentError(() => rnd.nextInt(i + 1)); | |
| rnd = new Random(6790); | |
| 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++) { | |
| if (rawSeed * m < 0) { | |
| // Overflow. | |
| break; | |
| } | |
| 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)); | |
| } |