16次发布
0.1.3400 | 2021年10月3日 |
---|---|
0.1.3355 | 2021年10月3日 |
0.1.3000 | 2021年9月29日 |
1264 在 算法 中
每月30次下载
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的来源
我在玩状态混合,发现了一些令人惊讶地有效的方法,这就是结果。它太好了,不分享给世界。