diff --git a/Cargo.lock b/Cargo.lock index 5bdaf61196..7e0f5c0f90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3702,8 +3702,8 @@ dependencies = [ "print-positions", "procfs", "quick-xml 0.37.1", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.0", + "rand_chacha 0.9.0", "rayon", "rmp", "roxmltree", diff --git a/Cargo.toml b/Cargo.toml index 3d11084007..0200139699 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -135,9 +135,9 @@ quick-xml = "0.37.0" quickcheck = "1.0" quickcheck_macros = "1.0" quote = "1.0" -rand = "0.8" +rand = "0.9" getrandom = "0.2" # pick same version that rand requires -rand_chacha = "0.3.1" +rand_chacha = "0.9" ratatui = "0.29" rayon = "1.10" reedline = "0.39.0" diff --git a/crates/nu-command/src/filters/shuffle.rs b/crates/nu-command/src/filters/shuffle.rs index 35e64f8ce7..0193f2e2f3 100644 --- a/crates/nu-command/src/filters/shuffle.rs +++ b/crates/nu-command/src/filters/shuffle.rs @@ -1,5 +1,5 @@ use nu_engine::command_prelude::*; -use rand::{prelude::SliceRandom, thread_rng}; +use rand::{prelude::SliceRandom, rng}; #[derive(Clone)] pub struct Shuffle; @@ -31,7 +31,7 @@ impl Command for Shuffle { ) -> Result { let metadata = input.metadata(); let mut values = input.into_iter_strict(call.head)?.collect::>(); - values.shuffle(&mut thread_rng()); + values.shuffle(&mut rng()); let iter = values.into_iter(); Ok(iter.into_pipeline_data_with_metadata( call.head, diff --git a/crates/nu-command/src/random/bool.rs b/crates/nu-command/src/random/bool.rs index 51870a7836..f2f07c8c5a 100644 --- a/crates/nu-command/src/random/bool.rs +++ b/crates/nu-command/src/random/bool.rs @@ -1,6 +1,5 @@ use nu_engine::command_prelude::*; - -use rand::prelude::{thread_rng, Rng}; +use rand::random_bool; #[derive(Clone)] pub struct RandomBool; @@ -77,8 +76,7 @@ fn bool( } } - let mut rng = thread_rng(); - let bool_result: bool = rng.gen_bool(probability); + let bool_result: bool = random_bool(probability); Ok(PipelineData::Value(Value::bool(bool_result, span), None)) } diff --git a/crates/nu-command/src/random/byte_stream.rs b/crates/nu-command/src/random/byte_stream.rs index baff8fbc6c..26d2482e6a 100644 --- a/crates/nu-command/src/random/byte_stream.rs +++ b/crates/nu-command/src/random/byte_stream.rs @@ -1,8 +1,8 @@ use nu_engine::command_prelude::*; use nu_protocol::Signals; use rand::{ - distributions::{Alphanumeric, Standard}, - thread_rng, Rng, + distr::{Alphanumeric, StandardUniform}, + rng, Rng, }; pub(super) enum RandomDistribution { @@ -31,9 +31,9 @@ pub(super) fn random_byte_stream( let bytes_to_write = std::cmp::min(remaining_bytes, OUTPUT_CHUNK_SIZE); - let rng = thread_rng(); + let rng = rng(); let byte_iter: Box> = match distribution { - RandomDistribution::Binary => Box::new(rng.sample_iter(Standard)), + RandomDistribution::Binary => Box::new(rng.sample_iter(StandardUniform)), RandomDistribution::Alphanumeric => Box::new(rng.sample_iter(Alphanumeric)), }; out.extend(byte_iter.take(bytes_to_write)); diff --git a/crates/nu-command/src/random/dice.rs b/crates/nu-command/src/random/dice.rs index c9720e49bb..d195e10f6f 100644 --- a/crates/nu-command/src/random/dice.rs +++ b/crates/nu-command/src/random/dice.rs @@ -1,6 +1,6 @@ use nu_engine::command_prelude::*; use nu_protocol::ListStream; -use rand::prelude::{thread_rng, Rng}; +use rand::random_range; #[derive(Clone)] pub struct RandomDice; @@ -73,10 +73,7 @@ fn dice( let dice: usize = call.get_flag(engine_state, stack, "dice")?.unwrap_or(1); let sides: usize = call.get_flag(engine_state, stack, "sides")?.unwrap_or(6); - let iter = (0..dice).map(move |_| { - let mut thread_rng = thread_rng(); - Value::int(thread_rng.gen_range(1..sides + 1) as i64, span) - }); + let iter = (0..dice).map(move |_| Value::int(random_range(1..sides + 1) as i64, span)); Ok(ListStream::new(iter, span, engine_state.signals().clone()).into()) } diff --git a/crates/nu-command/src/random/float.rs b/crates/nu-command/src/random/float.rs index fb7cc329b4..f47d128b2c 100644 --- a/crates/nu-command/src/random/float.rs +++ b/crates/nu-command/src/random/float.rs @@ -1,6 +1,6 @@ use nu_engine::command_prelude::*; use nu_protocol::{FloatRange, Range}; -use rand::prelude::{thread_rng, Rng}; +use rand::random_range; use std::ops::Bound; #[derive(Clone)] @@ -71,8 +71,6 @@ fn float( let span = call.head; let range: Option> = call.opt(engine_state, stack, 0)?; - let mut thread_rng = thread_rng(); - match range { Some(range) => { let range_span = range.span; @@ -90,15 +88,15 @@ fn float( } let value = match range.end() { - Bound::Included(end) => thread_rng.gen_range(range.start()..=end), - Bound::Excluded(end) => thread_rng.gen_range(range.start()..end), - Bound::Unbounded => thread_rng.gen_range(range.start()..f64::INFINITY), + Bound::Included(end) => random_range(range.start()..=end), + Bound::Excluded(end) => random_range(range.start()..end), + Bound::Unbounded => random_range(range.start()..f64::INFINITY), }; Ok(PipelineData::Value(Value::float(value, span), None)) } None => Ok(PipelineData::Value( - Value::float(thread_rng.gen_range(0.0..1.0), span), + Value::float(random_range(0.0..1.0), span), None, )), } diff --git a/crates/nu-command/src/random/int.rs b/crates/nu-command/src/random/int.rs index 2adff1ec70..90e3a0fbaf 100644 --- a/crates/nu-command/src/random/int.rs +++ b/crates/nu-command/src/random/int.rs @@ -1,6 +1,6 @@ use nu_engine::command_prelude::*; use nu_protocol::Range; -use rand::prelude::{thread_rng, Rng}; +use rand::random_range; use std::ops::Bound; #[derive(Clone)] @@ -75,8 +75,6 @@ fn integer( let span = call.head; let range: Option> = call.opt(engine_state, stack, 0)?; - let mut thread_rng = thread_rng(); - match range { Some(range) => { let range_span = range.span; @@ -94,9 +92,9 @@ fn integer( } let value = match range.end() { - Bound::Included(end) => thread_rng.gen_range(range.start()..=end), - Bound::Excluded(end) => thread_rng.gen_range(range.start()..end), - Bound::Unbounded => thread_rng.gen_range(range.start()..=i64::MAX), + Bound::Included(end) => random_range(range.start()..=end), + Bound::Excluded(end) => random_range(range.start()..end), + Bound::Unbounded => random_range(range.start()..=i64::MAX), }; Ok(PipelineData::Value(Value::int(value, span), None)) @@ -110,7 +108,7 @@ fn integer( } } None => Ok(PipelineData::Value( - Value::int(thread_rng.gen_range(0..=i64::MAX), span), + Value::int(random_range(0..=i64::MAX), span), None, )), } diff --git a/crates/nu-command/tests/commands/base/mod.rs b/crates/nu-command/tests/commands/base/mod.rs index 308f0b35df..7fef836350 100644 --- a/crates/nu-command/tests/commands/base/mod.rs +++ b/crates/nu-command/tests/commands/base/mod.rs @@ -1,5 +1,6 @@ use data_encoding::HEXUPPER; use rand::prelude::*; +use rand::random_range; use rand_chacha::ChaCha8Rng; use nu_test_support::nu; @@ -16,7 +17,7 @@ fn random_bytes() -> Vec { (0..NUM) .map(|_| { - let length = rng.gen_range(0..512); + let length = random_range(0..512); let mut bytes = vec![0u8; length]; rng.fill_bytes(&mut bytes); HEXUPPER.encode(&bytes) diff --git a/crates/nu-command/tests/commands/database/into_sqlite.rs b/crates/nu-command/tests/commands/database/into_sqlite.rs index 856757e768..93be9f27db 100644 --- a/crates/nu-command/tests/commands/database/into_sqlite.rs +++ b/crates/nu-command/tests/commands/database/into_sqlite.rs @@ -7,8 +7,9 @@ use nu_test_support::{ playground::{Dirs, Playground}, }; use rand::{ - distributions::{Alphanumeric, DistString, Standard}, + distr::{Alphanumeric, SampleString, StandardUniform}, prelude::Distribution, + random_range, rngs::StdRng, Rng, SeedableRng, }; @@ -382,7 +383,7 @@ struct TestRow( impl TestRow { pub fn random() -> Self { - StdRng::from_entropy().sample(Standard) + StdRng::from_os_rng().sample(StandardUniform) } } @@ -433,12 +434,12 @@ impl TryFrom<&rusqlite::Row<'_>> for TestRow { } } -impl Distribution for Standard { +impl Distribution for StandardUniform { fn sample(&self, rng: &mut R) -> TestRow where R: rand::Rng + ?Sized, { - let dt = DateTime::from_timestamp_millis(rng.gen_range(0..2324252554000)) + let dt = DateTime::from_timestamp_millis(random_range(0..2324252554000)) .unwrap() .fixed_offset(); @@ -446,18 +447,18 @@ impl Distribution for Standard { // limit the size of the numbers to work around // https://github.com/nushell/nushell/issues/10612 - let filesize = rng.gen_range(-1024..=1024); - let duration = rng.gen_range(-1024..=1024); + let filesize = random_range(-1024..=1024); + let duration = random_range(-1024..=1024); TestRow( - rng.gen(), - rng.gen(), - rng.gen(), + rng.random(), + rng.random(), + rng.random(), filesize, duration, dt, rand_string, - rng.gen::().to_be_bytes().to_vec(), + rng.random::().to_be_bytes().to_vec(), rusqlite::types::Value::Null, ) }