diff --git a/examples/inbreeding/environment.rs b/examples/inbreeding/environment.rs
index ff223dfd29a0095d968e607391cbb454528db7c0..2b1feaeb8438f2fb29919a02b72056f91b9c0403 100644
--- a/examples/inbreeding/environment.rs
+++ b/examples/inbreeding/environment.rs
@@ -1,4 +1,4 @@
-use rand::{seq::SliceRandom, RngCore};
+use rand::{seq::SliceRandom, Rng, RngCore};
 
 #[derive(Debug, PartialEq)]
 pub(super) enum Environment {
@@ -20,13 +20,13 @@ impl Environment {
         match self {
             Environment::Fixed { n } => things.iter().take(things.len() - n),
             Environment::RandomFixed { p, n } => {
-                if rand::random::<f64>() > *p {
+                if rng.gen::<f64>() > *p {
                     return things;
                 }
                 things.iter().take(things.len() - n)
             }
             Environment::RandomDynamic { p, q } => {
-                if rand::random::<f64>() > *p {
+                if rng.gen::<f64>() > *p {
                     return things;
                 }
                 things
diff --git a/examples/inbreeding/mod.rs b/examples/inbreeding/mod.rs
index cc2f524db6edc710afcccb7e6de5d1eda75ce204..730e8f2411df4def13b4e5ee38a218548e6f0843 100644
--- a/examples/inbreeding/mod.rs
+++ b/examples/inbreeding/mod.rs
@@ -41,14 +41,14 @@ use komodo::{
     fec::{self, Shard},
     linalg::Matrix,
 };
-use rand::{rngs::ThreadRng, seq::SliceRandom, thread_rng, Rng, RngCore};
+use rand::{rngs::StdRng, seq::SliceRandom, Rng, RngCore, SeedableRng};
 
 mod environment;
 mod strategy;
 
 use crate::{environment::Environment, strategy::Strategy};
 
-fn random_bytes(n: usize, rng: &mut ThreadRng) -> Vec<u8> {
+fn random_bytes(n: usize, rng: &mut impl RngCore) -> Vec<u8> {
     (0..n).map(|_| rng.gen::<u8>()).collect()
 }
 
@@ -222,6 +222,9 @@ struct Cli {
     measurement_schedule: usize,
     #[arg(long)]
     measurement_schedule_start: usize,
+
+    #[arg(long)]
+    prng_seed: u8,
 }
 
 fn main() {
@@ -235,7 +238,9 @@ fn main() {
         exit(1);
     }
 
-    let mut rng = thread_rng();
+    let mut seed: [u8; 32] = [0; 32];
+    seed[0] = cli.prng_seed;
+    let mut rng = StdRng::from_seed(seed);
 
     let bytes = random_bytes(cli.nb_bytes, &mut rng);
 
diff --git a/examples/inbreeding/strategy.rs b/examples/inbreeding/strategy.rs
index 0bc126424f93291adda2ea3468cdad4356c51ca9..f8f8143e63940a8bc9fdea4d01f15a72f4fed31e 100644
--- a/examples/inbreeding/strategy.rs
+++ b/examples/inbreeding/strategy.rs
@@ -1,4 +1,4 @@
-use rand::{seq::SliceRandom, RngCore};
+use rand::{seq::SliceRandom, Rng, RngCore};
 
 #[derive(Debug, PartialEq)]
 pub(super) enum Strategy {
@@ -14,7 +14,7 @@ impl Strategy {
         let nb_to_take = match self {
             Self::Single { n } => *n,
             Self::Double { p, n, m } => {
-                if rand::random::<f64>() < *p {
+                if rng.gen::<f64>() < *p {
                     *n
                 } else {
                     *m
diff --git a/scripts/inbreeding/run.nu b/scripts/inbreeding/run.nu
index d6cdc5096a083f1e9426ddbedf49e0893a3d1910..bf665af17ee5e4cbfedebf31c73397a7a36e2a35 100644
--- a/scripts/inbreeding/run.nu
+++ b/scripts/inbreeding/run.nu
@@ -14,7 +14,8 @@ export def main [
         max_t: int,
         strategies: list<string>,
         environment: string,
-    >
+    >,
+    --prng-seed: int = 0,
 ] {
     if $baseline {
         ^$BIN ...[
@@ -26,6 +27,7 @@ export def main [
             --measurement-schedule-start $options.measurement_schedule_start
             -t $options.max_t
             --test-case end-to-end
+            --prng-seed $prng_seed
         ] | lines | into float | save --force baseline.nuon
 
         print "baseline saved to `baseline.nuon`"
@@ -44,6 +46,7 @@ export def main [
                 --test-case recoding
                 --strategy $s
                 --environment $options.environment
+                --prng-seed $prng_seed
             ]
                 | lines
                 | parse "{t}, {diversity}"