Skip to main content

custom_rng/
custom_rng.rs

1//! Example demonstrating custom RNG usage for deterministic testing.
2
3use dice_parser::DiceExpr;
4use rand::{rngs::StdRng, SeedableRng};
5
6fn main() {
7    println!("=== Deterministic Rolling with Custom RNG ===\n");
8
9    let expr = DiceExpr::parse("2d6+3").unwrap();
10
11    println!("Rolling the same expression with the same seed produces identical results:\n");
12
13    // First roll with seed 42
14    let rng1 = StdRng::seed_from_u64(42);
15    let result1 = expr.roll_with_rng(rng1).unwrap();
16    println!("First roll (seed 42):");
17    println!("  Total: {}", result1.total);
18    println!("  Rolls: {:?}", result1.rolls);
19
20    // Second roll with the same seed should give the same result
21    let rng2 = StdRng::seed_from_u64(42);
22    let result2 = expr.roll_with_rng(rng2).unwrap();
23    println!("\nSecond roll (seed 42):");
24    println!("  Total: {}", result2.total);
25    println!("  Rolls: {:?}", result2.rolls);
26
27    assert_eq!(result1.total, result2.total);
28    assert_eq!(result1.rolls, result2.rolls);
29    println!("\n✓ Results match as expected!");
30
31    // Different seed produces different results
32    let rng3 = StdRng::seed_from_u64(123);
33    let result3 = expr.roll_with_rng(rng3).unwrap();
34    println!("\nThird roll (seed 123):");
35    println!("  Total: {}", result3.total);
36    println!("  Rolls: {:?}", result3.rolls);
37    println!("\n✓ Different seed produces different results (usually)");
38}