33 lines
1.0 KiB
JavaScript
33 lines
1.0 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { hash32, makeRng, rollFor } from '../src/sim/rng.js';
|
|
|
|
describe('rng', () => {
|
|
it('hash32 is deterministic and spreads', () => {
|
|
expect(hash32('abc')).toBe(hash32('abc'));
|
|
expect(hash32('abc')).not.toBe(hash32('abd'));
|
|
});
|
|
|
|
it('makeRng produces a deterministic sequence in [0,1)', () => {
|
|
const a = makeRng(42), b = makeRng(42);
|
|
for (let i = 0; i < 100; i++) {
|
|
const v = a();
|
|
expect(v).toBe(b());
|
|
expect(v).toBeGreaterThanOrEqual(0);
|
|
expect(v).toBeLessThan(1);
|
|
}
|
|
});
|
|
|
|
it('rollFor depends on seed and label, independently', () => {
|
|
expect(rollFor('s1', 'x')).toBe(rollFor('s1', 'x'));
|
|
expect(rollFor('s1', 'x')).not.toBe(rollFor('s1', 'y'));
|
|
expect(rollFor('s1', 'x')).not.toBe(rollFor('s2', 'x'));
|
|
});
|
|
|
|
it('rollFor is roughly uniform', () => {
|
|
let sum = 0;
|
|
for (let i = 0; i < 2000; i++) sum += rollFor('u', `l${i}`);
|
|
expect(sum / 2000).toBeGreaterThan(0.45);
|
|
expect(sum / 2000).toBeLessThan(0.55);
|
|
});
|
|
});
|