#random #xoroshiro #splitmix

xorshift

实现了高性能的 xoroshiro128+、xorshift128+、xorshift1024* 和 splitmix64 伪随机数生成器

4 个版本

使用旧的 Rust 2015

0.1.3 2017年2月12日
0.1.2 2017年1月3日
0.1.1 2016年10月31日
0.1.0 2016年10月29日

#49#rng

Download history 58/week @ 2024-03-03 72/week @ 2024-03-10 81/week @ 2024-03-17 57/week @ 2024-03-24 87/week @ 2024-03-31 55/week @ 2024-04-07 72/week @ 2024-04-14 82/week @ 2024-04-21 67/week @ 2024-04-28 66/week @ 2024-05-05 57/week @ 2024-05-12 142/week @ 2024-05-19 85/week @ 2024-05-26 81/week @ 2024-06-02 79/week @ 2024-06-09 110/week @ 2024-06-16

每月363 次下载
用于 7 个 crate (6 直接)

CC0 许可证

38KB
550

xorshift

Rust crate 实现了高性能的 splitmix64、xoroshiro128+、xorshift128+ 和 xorshift1024* PRNGs。从各自的公共领域 C 实现中派生而来。有关详细信息,请参阅 COPYRIGHT

Build Status crates.io page

文档

算法

请参阅 http://xoroshiro.di.unimi.it 了解 PRNGs 的概述及其推荐使用场景。对于并行模拟,推荐使用 xorshift1024*,否则使用 xoroshiro128+。splitmix64 适用于生成 PRNG 状态。

用法

[dependencies]
xorshift = "0.1"
extern crate xorshift;

示例

extern crate time;
extern crate xorshift;

use time::precise_time_ns;
use xorshift::{Rand, Rng, SeedableRng, SplitMix64, Xoroshiro128, Xorshift128, Xorshift1024};

fn main() {
    // Use the high-resolution performance counter for seeding
    let now = precise_time_ns();

    // Manually seed a Xorshift128+ PRNG
    let states = [now, now];
    let mut rng: Xorshift128 = SeedableRng::from_seed(&states[..]);
    println!("Xorshift128+ random u64: {}", rng.next_u64());

    // Use a SplitMix64 PRNG to seed a Xoroshiro128+ PRNG
    let mut sm: SplitMix64 = SeedableRng::from_seed(now);
    let mut rng: Xoroshiro128 = Rand::rand(&mut sm);
    println!("Xoroshiro128+ random u64: {}", rng.next_u64());

    let mut rng: Xorshift1024 = Rand::rand(&mut sm);
    println!("Xorshift1024* random u64: {}", rng.next_u64());

    // Generate 20 random u32s
    let vals = rng.gen_iter::<u32>().take(20).collect::<Vec<u32>>();
    println!("Xorshift1024* random u32: {:?}", vals);
    
    // Generate 50 random u64s
    let vals = rng.gen_iter::<u64>().take(50).collect::<Vec<u64>>();
    println!("Xorshift1024* random u64: {:?}", vals);
}

并行处理

具有少量并行性的应用程序应使用 Xoroshiro128+ 生成器。对于大规模并行计算,使用 Xorshift1024*。可以使用 thread_rng() 函数创建具有相同种子但增量跳跃状态的生成器,或者显式使用跳跃函数前进生成器状态。

extern crate xorshift;

use std::thread;
use xorshift::{Rng, Xorshift1024};
use xorshift::thread_rng;

fn main() {
    let mut threads = Vec::new();

    for i in 0..17 {
        threads.push(thread::spawn(move || {
            let mut r: Xorshift1024 = thread_rng();
            println!("Thread: {}, random u64: {}", i, r.next_u64());
        }));
    }

    for child in threads {
        let _ = child.join();
    }
}
extern crate time;
extern crate xorshift;

use std::thread;
use time::precise_time_ns;
use xorshift::{Rand, Rng, RngJump, SeedableRng, SplitMix64, Xorshift1024};

fn main() {
    // Use the high-resolution performance counter for seeding
    let now = precise_time_ns();

    let mut sm: SplitMix64 = SeedableRng::from_seed(now);
    let rng: Xorshift1024 = Rand::rand(&mut sm);

    let mut threads = Vec::new();

    for i in 0..17 {
        threads.push(thread::spawn(move || {
            let mut r = rng;
            r.jump(i);
            println!("Thread: {}, random u64: {}", i, r.next_u64());
        }));
    }

    for child in threads {
        let _ = child.join();
    }
}

许可证

Alexander Stocko 编写并在公共领域使用 Creative Commons Zero 声明 发布。

依赖项

~330–560KB