]> Repositorios git - scryer-prolog.git/commitdiff
Use a SeedableRng to generate random numbers
authorAdrián Arroyo Calle <[email protected]>
Wed, 20 Sep 2023 19:54:14 +0000 (21:54 +0200)
committerAdrián Arroyo Calle <[email protected]>
Wed, 20 Sep 2023 20:07:46 +0000 (22:07 +0200)
src/machine/mock_wam.rs
src/machine/mod.rs
src/machine/system_calls.rs

index cd8f783675459dace13238023932698518d280ff..2b8f2ca0abd9339d54cbf30d2e86c46175c5060e 100644 (file)
@@ -246,6 +246,7 @@ impl Machine {
             runtime,
             #[cfg(feature = "ffi")]
             foreign_function_table: Default::default(),
+           rng: StdRng::from_entropy(),
         };
 
         let mut lib_path = current_dir();
index 7e456d4ef318db22e4c8e5b9b6d7b368a5937b6d..d9f68ac3732600af568fbbe66c9e1ea3c7e4d991 100644 (file)
@@ -54,6 +54,8 @@ use std::env;
 use std::path::PathBuf;
 use std::sync::atomic::AtomicBool;
 use tokio::runtime::Runtime;
+use rand::rngs::StdRng;
+use rand::SeedableRng;
 
 lazy_static! {
     pub static ref INTERRUPT: AtomicBool = AtomicBool::new(false);
@@ -71,6 +73,7 @@ pub struct Machine {
     pub(super) runtime: Runtime,
     #[cfg(feature = "ffi")]
     pub(super) foreign_function_table: ForeignFunctionTable,
+    pub(super) rng: StdRng,
 }
 
 #[derive(Debug)]
@@ -472,6 +475,7 @@ impl Machine {
             runtime,
             #[cfg(feature = "ffi")]
             foreign_function_table: Default::default(),
+           rng: StdRng::from_entropy(),
         };
 
         let mut lib_path = current_dir();
index 412afca64a607c662fb063558f3ec8b8cadb4e80..81680e9b7fe0a1fed4c5e1c94335251dc85b94a1 100644 (file)
@@ -42,7 +42,6 @@ use indexmap::IndexSet;
 
 pub(crate) use ref_thread_local::RefThreadLocal;
 
-use std::borrow::BorrowMut;
 use std::cell::Cell;
 use std::cmp::Ordering;
 use std::collections::BTreeSet;
@@ -4216,15 +4215,13 @@ impl Machine {
 
     #[inline(always)]
     pub(crate) fn maybe(&mut self) {
-        fn generate_random_bits(num_bits: usize) -> u64 {
-            let mut rng = rand::thread_rng();
-            let rand = rng.borrow_mut();
+        fn generate_random_bits(rng: &mut rand::rngs::StdRng, num_bits: usize) -> u64 {
             let mut random_bits: u64 = 0;
 
             for _ in 0..num_bits {
                 random_bits <<= 1;
 
-                if rand.gen_bool(0.5) {
+                if rng.gen_bool(0.5) {
                     random_bits |= 1;
                 }
             }
@@ -4232,7 +4229,7 @@ impl Machine {
             random_bits
         }
 
-        let result = { generate_random_bits(1) == 0 };
+        let result = { generate_random_bits(&mut self.rng, 1) == 0 };
 
         self.machine_st.fail = result;
     }
@@ -6184,16 +6181,19 @@ impl Machine {
         match Number::try_from(seed) {
             Ok(Number::Fixnum(n)) => {
                 let n: u64 = Integer::from(n).try_into().unwrap();
-                let _: StdRng = SeedableRng::seed_from_u64(n);
+                let rng: StdRng = SeedableRng::seed_from_u64(n);
+               self.rng = rng;
             },
             Ok(Number::Integer(n)) => {
                 let n: u64 = (&*n).try_into().unwrap();
-                let _: StdRng = SeedableRng::seed_from_u64(n);
+                let rng: StdRng = SeedableRng::seed_from_u64(n);
+               self.rng = rng;
             },
             Ok(Number::Rational(n)) => {
                 if n.denominator() == &UBig::from(1 as u32) {
                     let n: u64 = n.numerator().try_into().unwrap();
-                    let _: StdRng = SeedableRng::seed_from_u64(n);
+                    let rng: StdRng = SeedableRng::seed_from_u64(n);
+                   self.rng = rng;
                 }
             }
             _ => {