1 个不稳定版本
0.1.0 | 2023年5月11日 |
---|
#24 在 #cellular-automata
12KB
175 行
R30-rs
使用Rule-30初等细胞自动机在Rust中实现的伪随机比特发生器
█
███
██ █
██ ████
██ █ █
██ ████ ███
██ █ █ █
██ ████ ██████
██ █ ███ █
██ ████ ██ █ ███
██ █ █ ████ ██ █
██ ████ ██ █ █ ████
██ █ ███ ██ ██ █ █
██ ████ ██ ███ ███ ██ ███
██ █ █ ███ █ ███ █ █
██ ████ ██ █ █ █████ ███████
请注意,R30不是一个密码学安全的伪随机数生成器,尽管它非常适合模拟。
与其他生成器相比,R30的状态很小,只有32位。MT19937需要大约2.5 KiB。R30甚至超过了状态大小为128位的TinyMT变体。因此,R30-32特别适合内存有限的系统。
初始化生成器
使用显式的u32种子
let mut gen: R30 = R30::new(69u32);
使用Default特质(UNIX_EPOCH的时间将按秒计算并平方)
let mut gen: R30 = R30::default();
如果您只想中间的细胞为1,只需使用center()特质
let mut gen: R30 = R30::center();
// Equivalent to R30::new(1 << 16)
使用生成器
R30结构体实现了为生成u32、u64、i32、i64、f32、f64和bool类型实现的特质,以及支持在区间[a, b]内生成u32和u64类型,以及从向量中均匀采样。
例如,生成一个随机布尔值
use r30_rs::*;
fn main() {
let mut gen = R30::default();
if gen.next_bool() {
println!("uwu");
} else {
println!("owo");
}
}
生成一个u32
let num: u32 = gen.next_u32();
u64、i32、i64、f32和f64类型以类似方式生成(next_
生成区间[a, b]内的u32或u64
// Roll a 6 sided die
let num: u32 = gen.next_u32_in(1, 6);
// Roll a D20
let roll: u64 = gen.next_u64_in(1, 20);
从Vec
fn main() {
let v = vec!["owo", "uwu", "OwO", "UwU", "() W ()"];
println!("{}", gen.rand_choice(&v));
}
测试生成器
为了测试一切是否正常工作,只需运行
cargo test --release
依赖关系
~315KB