diff --git a/Cargo.lock b/Cargo.lock index 5461cbb67d74..9083a8644a42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,10 +30,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -112,7 +112,7 @@ dependencies = [ "log", "num-bigint", "quad-rand", - "rand", + "rand 0.8.5", "regex-lite", "serde", "serde_bytes", @@ -180,7 +180,7 @@ dependencies = [ "either", "ethnum", "foreign_vec", - "getrandom", + "getrandom 0.2.15", "hash_hasher", "num-traits", "rustc_version", @@ -1184,7 +1184,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -1195,7 +1195,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1303,7 +1303,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -1383,7 +1383,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1577,10 +1577,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gimli" version = "0.31.1" @@ -1600,7 +1612,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -2426,7 +2438,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -2667,7 +2679,7 @@ dependencies = [ "parking_lot", "percent-encoding", "quick-xml", - "rand", + "rand 0.8.5", "reqwest", "ring", "rustls-pemfile 2.2.0", @@ -2817,7 +2829,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared", - "rand", + "rand 0.8.5", ] [[package]] @@ -2905,7 +2917,7 @@ dependencies = [ "either", "ethnum", "futures", - "getrandom", + "getrandom 0.2.15", "polars-arrow", "polars-core", "polars-error", @@ -2918,7 +2930,7 @@ dependencies = [ "polars-time", "polars-utils", "proptest", - "rand", + "rand 0.9.0", "tokio", "tokio-util", "version_check", @@ -2944,7 +2956,7 @@ dependencies = [ "fast-float2", "flate2", "futures", - "getrandom", + "getrandom 0.2.15", "hashbrown 0.15.2", "hex", "indexmap", @@ -2957,7 +2969,7 @@ dependencies = [ "polars-schema", "polars-utils", "proptest", - "rand", + "rand 0.9.0", "regex", "regex-syntax 0.8.5", "ryu", @@ -3001,7 +3013,7 @@ dependencies = [ "polars-arrow", "polars-error", "polars-utils", - "rand", + "rand 0.9.0", "ryu", "strength_reduce", "version_check", @@ -3032,7 +3044,7 @@ dependencies = [ "polars-row", "polars-schema", "polars-utils", - "rand", + "rand 0.9.0", "rand_distr", "rayon", "regex", @@ -3052,7 +3064,7 @@ dependencies = [ "aws-smithy-checksums", "chrono", "polars", - "rand", + "rand 0.9.0", "reqwest", "tokio", ] @@ -3103,7 +3115,7 @@ dependencies = [ "polars-row", "polars-time", "polars-utils", - "rand", + "rand 0.9.0", "rayon", ] @@ -3264,7 +3276,7 @@ dependencies = [ "polars-json", "polars-schema", "polars-utils", - "rand", + "rand 0.9.0", "rand_distr", "rayon", "regex", @@ -3299,7 +3311,7 @@ dependencies = [ "polars-error", "polars-parquet-format", "polars-utils", - "rand", + "rand 0.8.5", "serde", "simdutf8", "snap", @@ -3459,7 +3471,7 @@ dependencies = [ "polars-plan", "polars-time", "polars-utils", - "rand", + "rand 0.9.0", "regex", "serde", "sqlparser", @@ -3486,7 +3498,7 @@ dependencies = [ "polars-parquet", "polars-plan", "polars-utils", - "rand", + "rand 0.9.0", "rayon", "recursive", "slotmap", @@ -3535,7 +3547,7 @@ dependencies = [ "once_cell", "polars-error", "pyo3", - "rand", + "rand 0.9.0", "raw-cpuid", "rayon", "serde", @@ -3572,7 +3584,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -3593,8 +3605,8 @@ dependencies = [ "bitflags", "lazy_static", "num-traits", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax 0.8.5", "unarray", @@ -3735,7 +3747,7 @@ checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" dependencies = [ "env_logger", "log", - "rand", + "rand 0.8.5", ] [[package]] @@ -3763,8 +3775,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", - "getrandom", - "rand", + "getrandom 0.2.15", + "rand 0.8.5", "ring", "rustc-hash", "rustls 0.23.20", @@ -3806,8 +3818,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.1", + "zerocopy 0.8.20", ] [[package]] @@ -3817,7 +3840,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.1", ] [[package]] @@ -3826,17 +3859,27 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" +dependencies = [ + "getrandom 0.3.1", + "zerocopy 0.8.20", ] [[package]] name = "rand_distr" -version = "0.4.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand", + "rand 0.9.0", ] [[package]] @@ -3845,7 +3888,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b2a9fe2d7d9eeaf3279d1780452a5bbd26b31b27938787ef1c3e930d1e9cfbd" dependencies = [ - "rand", + "rand 0.8.5", "regex-syntax 0.6.29", ] @@ -3855,7 +3898,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -4052,7 +4095,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -4236,7 +4279,7 @@ checksum = "948bd219c6eb2b2ca1e004d8aefa8bbcf12614f60e0139b1758b49f9a94358c8" dependencies = [ "casey", "quickcheck", - "rand", + "rand 0.8.5", "rand_regex", "regex", ] @@ -4453,7 +4496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -4463,7 +4506,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" dependencies = [ "ahash", - "getrandom", + "getrandom 0.2.15", "halfbrown", "once_cell", "ref-cast", @@ -4711,7 +4754,7 @@ checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", - "getrandom", + "getrandom 0.2.15", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5083,7 +5126,7 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom", + "getrandom 0.2.15", "serde", ] @@ -5142,6 +5185,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.99" @@ -5504,6 +5556,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + [[package]] name = "write16" version = "1.0.0" @@ -5576,7 +5637,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +dependencies = [ + "zerocopy-derive 0.8.20", ] [[package]] @@ -5590,6 +5660,17 @@ dependencies = [ "syn 2.0.94", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.94", +] + [[package]] name = "zerofrom" version = "0.1.5" diff --git a/Cargo.toml b/Cargo.toml index 968423ee976a..d250c72d92c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,8 +60,8 @@ parking_lot = "0.12" percent-encoding = "2.3" pin-project-lite = "0.2" pyo3 = "0.23.4" -rand = "0.8" -rand_distr = "0.4" +rand = "0.9" +rand_distr = "0.5" raw-cpuid = "11" rayon = "1.9" recursive = "0.1" diff --git a/crates/polars-arrow/src/bitmap/utils/iterator.rs b/crates/polars-arrow/src/bitmap/utils/iterator.rs index 243372599687..93c6e329fe91 100644 --- a/crates/polars-arrow/src/bitmap/utils/iterator.rs +++ b/crates/polars-arrow/src/bitmap/utils/iterator.rs @@ -270,117 +270,4 @@ mod tests { assert_eq!(bitmap.set_bits(), 4); } - - #[test] - #[ignore = "Fuzz test. Too slow"] - fn test_fuzz_collect_into() { - for _ in 0..10_000 { - let mut set_bits = 0; - let mut unset_bits = 0; - - let mut length = 0; - let mut pattern = Vec::new(); - for _ in 0..rand::random::() % 1024 { - let bs = rand::random::() % 4; - - let word = match bs { - 0 => u64::MIN, - 1 => u64::MAX, - 2 | 3 => rand::random(), - _ => unreachable!(), - }; - - pattern.extend_from_slice(&word.to_le_bytes()); - set_bits += word.count_ones(); - unset_bits += word.count_zeros(); - length += 64; - } - - for _ in 0..rand::random::() % 7 { - let b = rand::random::(); - pattern.push(b); - set_bits += b.count_ones(); - unset_bits += b.count_zeros(); - length += 8; - } - - let last_length = rand::random::() % 8; - if last_length != 0 { - let b = rand::random::(); - pattern.push(b); - let ones = (b & ((1 << last_length) - 1)).count_ones(); - set_bits += ones; - unset_bits += last_length as u32 - ones; - length += last_length; - } - - let mut iter = BitmapIter::new(&pattern, 0, length); - let mut bitmap = MutableBitmap::with_capacity(length); - - while iter.num_remaining() > 0 { - let len_before = bitmap.len(); - let n = rand::random::() % iter.num_remaining(); - iter.collect_n_into(&mut bitmap, n); - - // Ensure we are booking the progress we expect - assert_eq!(bitmap.len(), len_before + n); - } - - let bitmap = bitmap.freeze(); - - assert_eq!(bitmap.set_bits(), set_bits as usize); - assert_eq!(bitmap.unset_bits(), unset_bits as usize); - } - } - - #[test] - #[ignore = "Fuzz test. Too slow"] - fn test_fuzz_leading_ops() { - for _ in 0..10_000 { - let mut length = 0; - let mut pattern = Vec::new(); - for _ in 0..rand::random::() % 1024 { - let bs = rand::random::() % 4; - - let word = match bs { - 0 => u64::MIN, - 1 => u64::MAX, - 2 | 3 => rand::random(), - _ => unreachable!(), - }; - - pattern.extend_from_slice(&word.to_le_bytes()); - length += 64; - } - - for _ in 0..rand::random::() % 7 { - pattern.push(rand::random::()); - length += 8; - } - - let last_length = rand::random::() % 8; - if last_length != 0 { - pattern.push(rand::random::()); - length += last_length; - } - - let mut iter = BitmapIter::new(&pattern, 0, length); - - let mut prev_remaining = iter.num_remaining(); - while iter.num_remaining() != 0 { - let num_ones = iter.clone().take_leading_ones(); - assert_eq!(num_ones, (&mut iter).take_while(|&b| b).count()); - - let num_zeros = iter.clone().take_leading_zeros(); - assert_eq!(num_zeros, (&mut iter).take_while(|&b| !b).count()); - - // Ensure that we are making progress - assert!(iter.num_remaining() < prev_remaining); - prev_remaining = iter.num_remaining(); - } - - assert_eq!(iter.take_leading_zeros(), 0); - assert_eq!(iter.take_leading_ones(), 0); - } - } } diff --git a/crates/polars-arrow/src/bitmap/utils/mod.rs b/crates/polars-arrow/src/bitmap/utils/mod.rs index 47729f94afa6..c7f3a9edb4ea 100644 --- a/crates/polars-arrow/src/bitmap/utils/mod.rs +++ b/crates/polars-arrow/src/bitmap/utils/mod.rs @@ -255,7 +255,7 @@ mod tests { #[ignore = "Fuzz test. Too slow"] #[test] fn leading_trailing_fuzz() { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); const SIZE: usize = 1000; const REPEATS: usize = 10_000; @@ -264,16 +264,16 @@ mod tests { for _ in 0..REPEATS { v.clear(); - let offset = rng.gen_range(0..SIZE); - let length = rng.gen_range(0..SIZE - offset); - let extra_padding = rng.gen_range(0..64); + let offset = rng.random_range(0..SIZE); + let length = rng.random_range(0..SIZE - offset); + let extra_padding = rng.random_range(0..64); let mut num_remaining = usize::min(SIZE, offset + length + extra_padding); while num_remaining > 0 { - let chunk_size = rng.gen_range(1..=num_remaining); + let chunk_size = rng.random_range(1..=num_remaining); v.extend( rng.clone() - .sample_iter(rand::distributions::Slice::new(&[false, true]).unwrap()) + .sample_iter(rand::distr::slice::Choose::new(&[false, true]).unwrap()) .take(chunk_size), ); num_remaining -= chunk_size; diff --git a/crates/polars-compute/src/filter/boolean.rs b/crates/polars-compute/src/filter/boolean.rs index e15a6f5f1ea4..3d9c2472e5d4 100644 --- a/crates/polars-compute/src/filter/boolean.rs +++ b/crates/polars-compute/src/filter/boolean.rs @@ -268,8 +268,8 @@ mod test { // Verify polyfill against naive implementation. let mut rng = StdRng::seed_from_u64(0xdeadbeef); for _ in 0..100 { - let x = rng.gen(); - let y = rng.gen(); + let x = rng.random(); + let y = rng.random(); assert_eq!(naive_pext64(x, y), pext64_polyfill(x, y, y.count_ones())); // Test all-zeros and all-ones. @@ -282,9 +282,9 @@ mod test { assert_eq!(naive_pext64(x, u64::MAX), pext64_polyfill(x, u64::MAX, 64)); // Test low popcount mask. - let popcnt = rng.gen_range(0..=8); + let popcnt = rng.random_range(0..=8); // Not perfect (can generate same bit twice) but it'll do. - let mask = (0..popcnt).map(|_| 1 << rng.gen_range(0..64)).sum(); + let mask = (0..popcnt).map(|_| 1 << rng.random_range(0..64)).sum(); assert_eq!( naive_pext64(x, mask), pext64_polyfill(x, mask, mask.count_ones()) diff --git a/crates/polars-core/src/chunked_array/random.rs b/crates/polars-core/src/chunked_array/random.rs index b927cdc8f9ee..c32dfcf35815 100644 --- a/crates/polars-core/src/chunked_array/random.rs +++ b/crates/polars-core/src/chunked_array/random.rs @@ -1,9 +1,9 @@ use num_traits::{Float, NumCast}; use polars_error::to_compute_err; -use rand::distributions::Bernoulli; +use rand::distr::Bernoulli; use rand::prelude::*; use rand::seq::index::IndexVec; -use rand_distr::{Normal, Standard, StandardNormal, Uniform}; +use rand_distr::{Distribution, Normal, StandardNormal, StandardUniform, Uniform}; use crate::prelude::DataType::Float64; use crate::prelude::*; @@ -15,7 +15,7 @@ fn create_rand_index_with_replacement(n: usize, len: usize, seed: Option) - return IdxCa::new_vec(PlSmallStr::EMPTY, vec![]); } let mut rng = SmallRng::seed_from_u64(seed.unwrap_or_else(get_global_random_u64)); - let dist = Uniform::new(0, len as IdxSize); + let dist = Uniform::new(0, len as IdxSize).unwrap(); (0..n as IdxSize) .map(move |_| dist.sample(&mut rng)) .collect_trusted::>() @@ -42,7 +42,7 @@ fn create_rand_index_no_replacement( // size returned. buf = match rand::seq::index::sample(&mut rng, len, n) { IndexVec::U32(v) => v.into_iter().map(|x| x as IdxSize).collect(), - IndexVec::USize(v) => v.into_iter().map(|x| x as IdxSize).collect(), + IndexVec::U64(v) => v.into_iter().map(|x| x as IdxSize).collect(), }; } IdxCa::new_vec(PlSmallStr::EMPTY, buf) @@ -51,16 +51,16 @@ fn create_rand_index_no_replacement( impl ChunkedArray where T: PolarsNumericType, - Standard: Distribution, + StandardUniform: Distribution, { pub fn init_rand(size: usize, null_density: f32, seed: Option) -> Self { let mut rng = SmallRng::seed_from_u64(seed.unwrap_or_else(get_global_random_u64)); (0..size) .map(|_| { - if rng.gen::() < null_density { + if rng.random::() < null_density { None } else { - Some(rng.gen()) + Some(rng.random()) } }) .collect() @@ -253,7 +253,7 @@ where ) -> PolarsResult { let normal = Normal::new(mean, std_dev).map_err(to_compute_err)?; let mut builder = PrimitiveChunkedBuilder::::new(name, length); - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); for _ in 0..length { let smpl = normal.sample(&mut rng); let smpl = NumCast::from(smpl).unwrap(); @@ -265,7 +265,7 @@ where /// Create [`ChunkedArray`] with samples from a Standard Normal distribution. pub fn rand_standard_normal(name: PlSmallStr, length: usize) -> Self { let mut builder = PrimitiveChunkedBuilder::::new(name, length); - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); for _ in 0..length { let smpl: f64 = rng.sample(StandardNormal); let smpl = NumCast::from(smpl).unwrap(); @@ -276,9 +276,9 @@ where /// Create [`ChunkedArray`] with samples from a Uniform distribution. pub fn rand_uniform(name: PlSmallStr, length: usize, low: f64, high: f64) -> Self { - let uniform = Uniform::new(low, high); + let uniform = Uniform::new(low, high).unwrap(); let mut builder = PrimitiveChunkedBuilder::::new(name, length); - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); for _ in 0..length { let smpl = uniform.sample(&mut rng); let smpl = NumCast::from(smpl).unwrap(); @@ -292,7 +292,7 @@ impl BooleanChunked { /// Create [`ChunkedArray`] with samples from a Bernoulli distribution. pub fn rand_bernoulli(name: PlSmallStr, length: usize, p: f64) -> PolarsResult { let dist = Bernoulli::new(p).map_err(to_compute_err)?; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut builder = BooleanChunkedBuilder::new(name, length); for _ in 0..length { let smpl = dist.sample(&mut rng); diff --git a/crates/polars-core/src/random.rs b/crates/polars-core/src/random.rs index f6fd3c1f3978..3a09c3ff022e 100644 --- a/crates/polars-core/src/random.rs +++ b/crates/polars-core/src/random.rs @@ -4,7 +4,7 @@ use once_cell::sync::Lazy; use rand::prelude::*; static POLARS_GLOBAL_RNG_STATE: Lazy> = - Lazy::new(|| Mutex::new(SmallRng::from_entropy())); + Lazy::new(|| Mutex::new(SmallRng::from_os_rng())); pub(crate) fn get_global_random_u64() -> u64 { POLARS_GLOBAL_RNG_STATE.lock().unwrap().next_u64() diff --git a/crates/polars-ops/src/chunked_array/gather_skip_nulls.rs b/crates/polars-ops/src/chunked_array/gather_skip_nulls.rs index d4e7fa694f2c..1fb2c5e6526c 100644 --- a/crates/polars-ops/src/chunked_array/gather_skip_nulls.rs +++ b/crates/polars-ops/src/chunked_array/gather_skip_nulls.rs @@ -154,7 +154,7 @@ where mod test { use std::ops::Range; - use rand::distributions::uniform::SampleUniform; + use rand::distr::uniform::SampleUniform; use rand::prelude::*; use super::*; @@ -164,13 +164,13 @@ mod test { val: Range, len_range: Range, ) -> Vec { - let n = rng.gen_range(len_range); - (0..n).map(|_| rng.gen_range(val.clone())).collect() + let n = rng.random_range(len_range); + (0..n).map(|_| rng.random_range(val.clone())).collect() } fn random_filter(rng: &mut R, v: &[T], pr: Range) -> Vec> { - let p = rng.gen_range(pr); - let rand_filter = |x| Some(x).filter(|_| rng.gen::() < p); + let p = rng.random_range(pr); + let rand_filter = |x| Some(x).filter(|_| rng.random::() < p); v.iter().cloned().map(rand_filter).collect() } @@ -203,12 +203,12 @@ mod test { let mut rng = SmallRng::seed_from_u64(0xdeadbeef); for _test in 0..20 { - let num_elem_chunks = rng.gen_range(1..10); + let num_elem_chunks = rng.random_range(1..10); let elem_chunks: Vec<_> = (0..num_elem_chunks).map(|_| random_vec(&mut rng, 0..u32::MAX, 0..100)).collect(); let null_elem_chunks: Vec<_> = elem_chunks.iter().map(|c| random_filter(&mut rng, c, 0.7..1.0)).collect(); let num_nonnull_elems: usize = null_elem_chunks.iter().map(|c| c.iter().filter(|x| x.is_some()).count()).sum(); - let num_idx_chunks = rng.gen_range(1..10); + let num_idx_chunks = rng.random_range(1..10); let idx_chunks: Vec<_> = (0..num_idx_chunks).map(|_| random_vec(&mut rng, 0..num_nonnull_elems as IdxSize, 0..200)).collect(); let null_idx_chunks: Vec<_> = idx_chunks.iter().map(|c| random_filter(&mut rng, c, 0.7..1.0)).collect(); diff --git a/crates/polars-ops/src/series/ops/rank.rs b/crates/polars-ops/src/series/ops/rank.rs index a3f41bf7a5b0..0b013731524d 100644 --- a/crates/polars-ops/src/series/ops/rank.rs +++ b/crates/polars-ops/src/series/ops/rank.rs @@ -38,7 +38,7 @@ impl Default for RankOptions { #[cfg(feature = "random")] fn get_random_seed() -> u64 { - let mut rng = SmallRng::from_entropy(); + let mut rng = SmallRng::from_os_rng(); rng.next_u64() } diff --git a/crates/polars-sql/src/sql_expr.rs b/crates/polars-sql/src/sql_expr.rs index 4962eb2b844c..fae51ff172f6 100644 --- a/crates/polars-sql/src/sql_expr.rs +++ b/crates/polars-sql/src/sql_expr.rs @@ -14,8 +14,8 @@ use polars_lazy::prelude::*; use polars_plan::prelude::typed_lit; use polars_plan::prelude::LiteralValue::Null; use polars_time::Duration; -use rand::distributions::Alphanumeric; -use rand::{thread_rng, Rng}; +use rand::distr::Alphanumeric; +use rand::{rng, Rng}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use sqlparser::ast::{ @@ -267,7 +267,7 @@ impl SQLExprVisitor<'_> { if schema.len() != 1 { polars_bail!(SQLSyntax: "SQL subquery returns more than one column"); } - let rand_string: String = thread_rng() + let rand_string: String = rng() .sample_iter(&Alphanumeric) .take(16) .map(char::from) diff --git a/crates/polars-stream/src/async_executor/mod.rs b/crates/polars-stream/src/async_executor/mod.rs index 23789e5a20df..573bc610a7d7 100644 --- a/crates/polars-stream/src/async_executor/mod.rs +++ b/crates/polars-stream/src/async_executor/mod.rs @@ -211,7 +211,7 @@ impl Executor { fn runner(&self, thread: usize) { TLS_THREAD_ID.set(thread); - let mut rng = SmallRng::from_rng(&mut rand::thread_rng()).unwrap(); + let mut rng = SmallRng::from_rng(&mut rand::rng()); let mut worker = self.park_group.new_worker(); let mut last_block_start = None; @@ -420,10 +420,10 @@ fn random_permutation(len: u32, rng: &mut R) -> impl Iterator(); - let odd1 = rng.gen::() | 1; - let odd2 = rng.gen::() | 1; - let uniform_first = ((rng.gen::() as u64 * len as u64) >> 32) as u32; + let displace_zero = rng.random::(); + let odd1 = rng.random::() | 1; + let odd2 = rng.random::() | 1; + let uniform_first = ((rng.random::() as u64 * len as u64) >> 32) as u32; (0..modulus) .map(move |mut i| { diff --git a/crates/polars-stream/src/async_primitives/distributor_channel.rs b/crates/polars-stream/src/async_primitives/distributor_channel.rs index fa8685f88925..42156a59d879 100644 --- a/crates/polars-stream/src/async_primitives/distributor_channel.rs +++ b/crates/polars-stream/src/async_primitives/distributor_channel.rs @@ -59,7 +59,7 @@ pub fn distributor_channel( let sender = Sender { inner, round_robin_idx: 0, - rng: SmallRng::from_rng(&mut rand::thread_rng()).unwrap(), + rng: SmallRng::from_rng(&mut rand::rng()), }; (sender, receivers) @@ -127,7 +127,7 @@ impl Sender { let mut hungriest_idx = self.round_robin_idx; let mut shortest_len = self.upper_bound_len(self.round_robin_idx); for _ in 0..4 { - let idx = ((self.rng.gen::() as u64 * num_receivers as u64) >> 32) as usize; + let idx = ((self.rng.random::() as u64 * num_receivers as u64) >> 32) as usize; let len = self.upper_bound_len(idx); if len < shortest_len { shortest_len = len; @@ -145,7 +145,7 @@ impl Sender { let park = self.inner.send_parker.park(); // Try all receivers, starting at a random index. - let mut idx = ((self.rng.gen::() as u64 * num_receivers as u64) >> 32) as usize; + let mut idx = ((self.rng.random::() as u64 * num_receivers as u64) >> 32) as usize; let mut all_closed = true; for _ in 0..num_receivers { match unsafe { self.try_send(idx, value) } { diff --git a/crates/polars-utils/src/clmul.rs b/crates/polars-utils/src/clmul.rs index ac6fc541c400..11b82bc0c7b7 100644 --- a/crates/polars-utils/src/clmul.rs +++ b/crates/polars-utils/src/clmul.rs @@ -110,8 +110,8 @@ mod test { // Verify platform-specific clmul to portable. let mut rng = StdRng::seed_from_u64(0xdeadbeef); for _ in 0..100 { - let x = rng.gen(); - let y = rng.gen(); + let x = rng.random(); + let y = rng.random(); assert_eq!(portable_clmul64(x, y), clmul64(x, y)); } @@ -143,7 +143,7 @@ mod test { // Verify platform-specific prefix_xorsum to portable. let mut rng = StdRng::seed_from_u64(0xdeadbeef); for _ in 0..100 { - let x = rng.gen(); + let x = rng.random(); assert_eq!(portable_prefix_xorsum(x), prefix_xorsum(x)); } diff --git a/crates/polars/tests/it/lazy/cwc.rs b/crates/polars/tests/it/lazy/cwc.rs index 5be002410391..010305eec22e 100644 --- a/crates/polars/tests/it/lazy/cwc.rs +++ b/crates/polars/tests/it/lazy/cwc.rs @@ -13,12 +13,12 @@ fn fuzz_cluster_with_columns() { } fn rnd_prime(rng: &'_ mut rand::rngs::ThreadRng) -> i32 { - PRIMES[rng.gen_range(0..PRIMES.len())] + PRIMES[rng.random_range(0..PRIMES.len())] } fn sample(rng: &'_ mut rand::rngs::ThreadRng, slice: &[u8]) -> u8 { assert!(!slice.is_empty()); - slice[rng.gen_range(0..slice.len())] + slice[rng.random_range(0..slice.len())] } fn gen_expr(rng: &mut rand::rngs::ThreadRng, used_cols: &[u8]) -> Expr { @@ -27,7 +27,7 @@ fn fuzz_cluster_with_columns() { use rand::Rng; fn leaf(rng: &mut rand::rngs::ThreadRng, used_cols: &[u8]) -> Expr { - if rng.gen() { + if rng.random() { lit(rnd_prime(rng)) } else { col(to_str!(sample(rng, used_cols))) @@ -37,7 +37,7 @@ fn fuzz_cluster_with_columns() { let mut e = leaf(rng, used_cols); loop { - if depth >= 10 || rng.gen() { + if depth >= 10 || rng.random() { return e; } else { e = e * col(to_str!(sample(rng, used_cols))); @@ -53,7 +53,7 @@ fn fuzz_cluster_with_columns() { const NUM_WITH_COLUMNS: RangeInclusive = 1..=64; const NUM_EXPRS: RangeInclusive = 1..=8; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let rng = &mut rng; let mut unused_cols: Vec = Vec::with_capacity(26); @@ -69,11 +69,11 @@ fn fuzz_cluster_with_columns() { used_cols.clear(); unused_cols.extend(b'a'..=b'z'); - let num_with_columns = rng.gen_range(NUM_WITH_COLUMNS.clone()); - let num_columns = rng.gen_range(NUM_ORIGINAL_COLS.clone()); + let num_with_columns = rng.random_range(NUM_WITH_COLUMNS.clone()); + let num_columns = rng.random_range(NUM_ORIGINAL_COLS.clone()); for _ in 0..num_columns { - let column = rng.gen_range(0..unused_cols.len()); + let column = rng.random_range(0..unused_cols.len()); let column = unused_cols.swap_remove(column); columns.push(Column::new(to_str!(column).into(), vec![rnd_prime(rng)])); @@ -83,13 +83,13 @@ fn fuzz_cluster_with_columns() { let mut lf = DataFrame::new(std::mem::take(&mut columns)).unwrap().lazy(); for _ in 0..num_with_columns { - let num_exprs = rng.gen_range(0..8); + let num_exprs = rng.random_range(0..8); let mut exprs = Vec::with_capacity(*NUM_EXPRS.end()); used.clear(); for _ in 0..num_exprs { let col = loop { - let col = if unused_cols.is_empty() || rng.gen() { + let col = if unused_cols.is_empty() || rng.random() { sample(rng, &used_cols) } else { sample(rng, &unused_cols) diff --git a/crates/polars/tests/it/lazy/exprs.rs b/crates/polars/tests/it/lazy/exprs.rs index 84dfb7ade3cf..9fea72ae909a 100644 --- a/crates/polars/tests/it/lazy/exprs.rs +++ b/crates/polars/tests/it/lazy/exprs.rs @@ -25,7 +25,7 @@ fn fuzz_exprs() { .lazy(); fn rnd_prime(rng: &'_ mut rand::rngs::ThreadRng) -> i32 { - PRIMES[rng.gen_range(0..PRIMES.len())] + PRIMES[rng.random_range(0..PRIMES.len())] } fn gen_expr(rng: &mut rand::rngs::ThreadRng) -> Expr { @@ -34,7 +34,7 @@ fn fuzz_exprs() { use rand::Rng; fn leaf(rng: &mut rand::rngs::ThreadRng) -> Expr { - match rng.gen::() % 4 { + match rng.random::() % 4 { 0 => col("A"), 1 => col("B"), 2 => col("C"), @@ -45,12 +45,12 @@ fn fuzz_exprs() { let mut e = leaf(rng); loop { - if depth >= 10 || rng.gen::() % 4 == 0 { + if depth >= 10 || rng.random::() % 4 == 0 { return e; } else { let rhs = leaf(rng); - e = match rng.gen::() % 19 { + e = match rng.random::() % 19 { 0 => e.eq(rhs), 1 => e.eq_missing(rhs), 2 => e.neq(rhs), @@ -83,7 +83,7 @@ fn fuzz_exprs() { } } - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let rng = &mut rng; let num_fuzzes = 100_000; @@ -97,7 +97,7 @@ fn fuzz_exprs() { gen_expr(rng).alias("J"), ]; - let wc = match rng.gen::() % 2 { + let wc = match rng.random::() % 2 { 0 => lf.clone(), _ => empty.clone(), }; diff --git a/docs/source/src/rust/user-guide/expressions/operations.rs b/docs/source/src/rust/user-guide/expressions/operations.rs index 55fbf9412f0e..99efef3c1812 100644 --- a/docs/source/src/rust/user-guide/expressions/operations.rs +++ b/docs/source/src/rust/user-guide/expressions/operations.rs @@ -74,11 +74,11 @@ fn main() -> Result<(), Box> { // --8<-- [end:bitwise] // --8<-- [start:count] - use rand::distributions::{Distribution, Uniform}; - use rand::thread_rng; + use rand::distr::{Distribution, Uniform}; + use rand::rng; - let mut rng = thread_rng(); - let between = Uniform::new_inclusive(0, 100_000); + let mut rng = rng(); + let between = Uniform::new_inclusive(0, 100_000).unwrap(); let arr: Vec = between.sample_iter(&mut rng).take(100_100).collect(); let long_df = df!(