Skip to main content

miden_test_utils/
rand.rs

1#[cfg(feature = "std")]
2pub use miden_crypto::rand::{
3    random_felt, random_word,
4    test_utils::{rand_array, rand_value, rand_vector},
5};
6
7#[cfg(feature = "std")]
8use super::QuadFelt;
9use super::{Felt, Word};
10// RANDOM GENERATORS
11// ================================================================================================
12
13/// Generates a random QuadFelt
14#[cfg(feature = "std")]
15pub fn rand_quad_felt() -> QuadFelt {
16    QuadFelt::new([rand_value(), rand_value()])
17}
18
19// SEEDED GENERATORS
20// ================================================================================================
21
22pub fn seeded_word(seed: &mut u64) -> Word {
23    let elements = [
24        seeded_element(seed),
25        seeded_element(seed),
26        seeded_element(seed),
27        seeded_element(seed),
28    ];
29    elements.into()
30}
31
32pub fn seeded_element(seed: &mut u64) -> Felt {
33    *seed = (*seed).wrapping_add(0x9e37_79b9_7f4a_7c15);
34    Felt::new(splitmix64(*seed))
35}
36
37// HELPERS
38// ================================================================================================
39
40/// SplitMix64 hash function for mixing RNG state into high-quality random output.
41fn splitmix64(mut z: u64) -> u64 {
42    z = (z ^ (z >> 30)).wrapping_mul(0xbf58_476d_1ce4_e5b9);
43    z = (z ^ (z >> 27)).wrapping_mul(0x94d0_49bb_1331_11eb);
44    z ^ (z >> 31)
45}