blob: 4c36c1786523c52f6d5b6e97a5d6b39be1258063 [file] [log] [blame]
// 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.
// @dart = 2.9
// 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));
}