#random #rand #cellular-automata #generator #bit #implemented #r30

bin+lib r30_rs

使用Rule-30初等细胞自动机在Rust中实现的伪随机比特发生器

1 个不稳定版本

0.1.0 2023年5月11日

#24#cellular-automata

MIT 许可证

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