Refactor random number generation to factory
- Use a `make-random` factory to create isolated random number generators. - Remove the global `prng` from the `Environment`. - Ensure `make-random` can be called with or without a seed.
This commit is contained in:
+15
-14
@@ -175,12 +175,13 @@ mod tests {
|
||||
let env1 = Environment::new();
|
||||
let env2 = Environment::new();
|
||||
|
||||
// 1. Seed env1
|
||||
env1.run_script("(seed! 123)").unwrap();
|
||||
let val1_a = env1.run_script("(random)").unwrap();
|
||||
// 1. Create a seeded generator in env1
|
||||
env1.run_script("(def rand (make-random 123))").unwrap();
|
||||
let val1_a = env1.run_script("(rand)").unwrap();
|
||||
|
||||
// 2. env2 should have its own default seed state
|
||||
let val2_a = env2.run_script("(random)").unwrap();
|
||||
// 2. env2 should have its own default seed state for its generators
|
||||
env2.run_script("(def rand (make-random))").unwrap();
|
||||
let val2_a = env2.run_script("(rand)").unwrap();
|
||||
|
||||
// They are highly unlikely to be equal by default,
|
||||
// and seeding env1 MUST not have seeded env2.
|
||||
@@ -189,9 +190,9 @@ mod tests {
|
||||
"Environments must have isolated PRNG states"
|
||||
);
|
||||
|
||||
// 3. Seed env2 differently
|
||||
env2.run_script("(seed! 123)").unwrap();
|
||||
let val2_b = env2.run_script("(random)").unwrap();
|
||||
// 3. Create another generator in env2 with the same seed
|
||||
env2.run_script("(def rand-same (make-random 123))").unwrap();
|
||||
let val2_b = env2.run_script("(rand-same)").unwrap();
|
||||
|
||||
// After same seeding, they should match (isolated but identical seed)
|
||||
assert_eq!(
|
||||
@@ -205,12 +206,12 @@ mod tests {
|
||||
let env = Environment::new();
|
||||
|
||||
// 1. First run with seed 42
|
||||
env.run_script("(seed! 42)").unwrap();
|
||||
let val1 = env.run_script("(random)").unwrap();
|
||||
env.run_script("(def rand1 (make-random 42))").unwrap();
|
||||
let val1 = env.run_script("(rand1)").unwrap();
|
||||
|
||||
// 2. Second run with same seed 42
|
||||
env.run_script("(seed! 42)").unwrap();
|
||||
let val2 = env.run_script("(random)").unwrap();
|
||||
env.run_script("(def rand2 (make-random 42))").unwrap();
|
||||
let val2 = env.run_script("(rand2)").unwrap();
|
||||
|
||||
assert_eq!(
|
||||
val1, val2,
|
||||
@@ -218,8 +219,8 @@ mod tests {
|
||||
);
|
||||
|
||||
// 3. Third run with different seed
|
||||
env.run_script("(seed! 123)").unwrap();
|
||||
let val3 = env.run_script("(random)").unwrap();
|
||||
env.run_script("(def rand3 (make-random 123))").unwrap();
|
||||
let val3 = env.run_script("(rand3)").unwrap();
|
||||
assert_ne!(val1, val3, "Random results must differ for different seeds");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user