Files
2026-09-16 19:59:18 +02:00

49 lines
1.6 KiB
JavaScript

import { TestCase } from "./framework/test_case.js";
import { Random, randomSeed, mulberry32 } from "../shared/rng.js";
export class RngTest extends TestCase {
test_mulberry32_is_deterministic_and_unit_interval() {
const a = mulberry32(42);
const b = mulberry32(42);
for (let i = 0; i < 100; i++) {
const value = a();
this.assertEqual(value, b(), "same seed yields the same stream");
this.assert(value >= 0 && value < 1, `value in [0,1): ${value}`);
}
}
test_random_range_is_inclusive() {
const random = new Random(1);
const seen = new Set();
for (let i = 0; i < 500; i++) {
const value = random.range(2, 5);
this.assert(value >= 2 && value <= 5, `range out of bounds: ${value}`);
seen.add(value);
}
this.assertEqual(seen.size, 4, "all four values were produced");
}
test_random_float_in_unit_interval() {
const random = new Random(9);
for (let i = 0; i < 100; i++) {
const value = random.float();
this.assert(value >= 0 && value < 1, `float in [0,1): ${value}`);
}
}
test_shuffle_preserves_elements_and_is_deterministic() {
const values = [1, 2, 3, 4, 5, 6, 7, 8];
const shuffled = new Random(5).shuffle(values.slice());
this.assertEqual(shuffled.slice().sort((a, b) => a - b), values);
this.assertEqual(shuffled, new Random(5).shuffle(values.slice()));
}
test_random_seed_is_a_nonzero_integer() {
for (let i = 0; i < 20; i++) {
const seed = randomSeed();
this.assertTrue(Number.isInteger(seed), "seed is an integer");
this.assertNotEqual(seed, 0);
}
}
}