#random #xor #length #byte-length #counter

xor_rand

任意字节长度的计数器基于PRNG包

16次发布

0.1.3400 2021年10月3日
0.1.3355 2021年10月3日
0.1.3000 2021年9月29日

1264算法

每月30次下载

AGPL-3.0-or-later

5KB
71

任意状态长度,基于加法xor的PRNG

如何使用此库

建议保留一个全局状态,初始化时状态长度大于4字节,并在获取随机数时通过可变引用传递。

以下是一些解释简单方面的源代码,更多功能,如迭代器,可以在源代码中找到。

use std::time::{SystemTime, UNIX_EPOCH};
use xor_rand::XorRand;

fn main() {
    // Default creation, 8 bytes state size
    // let mut prng = XorRand::default();

    // Creating prng, 0-2 is bad, 3-4 ok, 5-8 good, 9+ excellent
    let mut prng = XorRand::new(16);

    // Seeding prng
    prng.seed("Hello, world!".as_bytes());
    let number = i64::from_be_bytes(prng.next_bytes());
    println!("Well this was unexpected: {}", number);

    // Seeding with system time
    let now = SystemTime::now();
    let since_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards");
    let seed = since_epoch.as_micros();
    prng.seed(&seed.to_be_bytes());

    // Simple byte use
    println!(
        "The first byte this prng should output: {}",
        prng.next_byte()
    );

    // Simple integer use
    for _ in 0..10 {
        let random_num = u128::from_be_bytes(prng.next_bytes());
        println!("Here is a pseudo random number: {}!", random_num);
    }

    // Passing to functions
    roll_dice(&mut prng);

    // An example of how to NOT get uniform floats.
    // Instead, get a uniform integer and cast to a float, divide to get required precision.
    println!(
        "NON UNIFORM RANDOMNESS: {:+e}",
        f64::from_be_bytes(prng.next_bytes())
    );
}

fn roll_dice(prng: &mut XorRand) {
    let dice_roll = u32::from_le_bytes(prng.next_bytes()) % 6;
    println!("You rolled a {}!", dice_roll + 1);
}

这个基于xor的PRNG的来源

我在玩状态混合,发现了一些令人惊讶地有效的方法,这就是结果。它太好了,不分享给世界。

没有运行时依赖