Rust随机数生成库pcg-mwc的使用:高性能PCG乘法带进位随机数生成器实现

Rust随机数生成库pcg-mwc的使用:高性能PCG乘法带进位随机数生成器实现

Permuted Mwc随机数生成器

它是PCG家族的一员,但使用了MWC(Multiply-with-carry)生成器而不是LCG(线性同余生成器)。这种MWC是MCG(Multiplicative congruential generator)生成器的一种特殊形式,类似于PGC-64-fast变体。

与PGC-64-fast相比,Mwc256XXA64更快并且产生更高质量的随机数(因为它使用了完整的256位状态,而不是仅使用一半)。

Mwc256XXA64

一个快速的、高质量的伪随机数生成器,具有64位输出和256位状态。在64位架构上更快。

Mwc128XXA32

一个快速的、高质量的伪随机数生成器,具有32位输出和128位状态。在32位架构上更快。

安装

在项目目录中运行以下Cargo命令:

cargo add pcg-mwc

或者在Cargo.toml中添加以下行:

pcg-mwc = "0.2.1"

使用示例

以下是使用pcg-mwc库生成随机数的完整示例:

use pcg_mwc::Mwc256XXA64;
use rand::{Rng, SeedableRng};

fn main() {
    // 创建一个新的随机数生成器实例
    let mut rng = Mwc256XXA64::seed_from_u64(12345); // 使用种子初始化
    
    // 生成不同类型的随机数
    println!("随机u32: {}", rng.gen::<u32>());
    println!("随机u64: {}", rng.gen::<u64>());
    println!("随机f32: {}", rng.gen::<f32>());
    println!("随机f64: {}", rng.gen::<f64>());
    
    // 生成指定范围的随机数
    println!("1-100之间的随机数: {}", rng.gen_range(1..=100));
    
    // 生成随机布尔值
    println!("随机布尔值: {}", rng.gen::<bool>());
    
    // 打乱数组
    let mut arr = [1, 2, 3, 4, 5];
    rng.shuffle(&mut arr);
    println!("打乱后的数组: {:?}", arr);
}

高级用法

use pcg_mwc::Mwc256XXA64;
use rand::{Rng, SeedableRng};

fn main() {
    // 使用系统时间作为种子
    let seed = std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap()
        .as_secs();
    
    let mut rng = Mwc256XXA64::seed_from_u64(seed);
    
    // 生成随机密码
    let password: String = (0..16)
        .map(|_| rng.sample(rand::distributions::Alphanumeric) as char)
        .collect();
    println!("随机密码: {}", password);
    
    // 生成高斯分布的随机数
    let normal = rand::distributions::Normal::new(0.0, 1.0);
    println!("高斯分布随机数: {}", rng.sample(normal));
}

性能说明

Mwc256XXA64在64位架构上性能最佳,适合需要高质量随机数的应用场景。对于32位系统,可以考虑使用Mwc128XXA32以获得更好的性能。

完整示例demo

下面是一个整合基础用法和高级用法的完整示例:

use pcg_mwc::Mwc256XXA64;
use rand::{Rng, SeedableRng};
use rand::distributions::{Alphanumeric, Normal};

fn main() {
    println!("=== 基础随机数生成示例 ===");
    basic_random_demo();
    
    println!("\n=== 高级随机数生成示例 ===");
    advanced_random_demo();
}

fn basic_random_demo() {
    // 使用固定种子初始化
    let mut rng = Mwc256XXA64::seed_from_u64(12345);
    
    // 生成各种基本类型的随机数
    println!("随机u8: {}", rng.gen::<u8>());
    println!("随机i32: {}", rng.gen::<i32>());
    println!("随机f64: {}", rng.gen::<f64>());
    println!("随机布尔值: {}", rng.gen::<bool>());
    
    // 生成范围随机数
    println!("1-100之间的整数: {}", rng.gen_range(1..=100));
    println!("0.0-1.0之间的浮点数: {}", rng.gen_range(0.0..1.0));
    
    // 数组打乱
    let mut cards = ["A", "K", "Q", "J", "10"];
    rng.shuffle(&mut cards);
    println!("打乱后的牌组: {:?}", cards);
}

fn advanced_random_demo() {
    // 使用系统时间作为种子
    let seed = std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap()
        .as_secs();
    let mut rng = Mwc256XXA64::seed_from_u64(seed);
    
    // 生成随机字符串
    let random_string: String = (0..10)
        .map(|_| rng.sample(Alphanumeric) as char)
        .collect();
    println!("随机字符串: {}", random_string);
    
    // 生成随机颜色RGB值
    let color = (
        rng.gen_range(0..=255),
        rng.gen_range(0..=255),
        rng.gen_range(0..=255)
    );
    println!("随机RGB颜色: {:?}", color);
    
    // 生成正态分布随机数
    let normal = Normal::new(0.0, 1.0);
    println!("正态分布随机数: {:.4}", rng.sample(normal));
    
    // 生成随机选择
    let options = ["苹果", "香蕉", "橙子", "葡萄"];
    println!("随机选择水果: {}", rng.choose(&options).unwrap());
}

这个完整示例展示了:

  1. 基础随机数生成功能
  2. 使用系统时间作为种子
  3. 生成随机字符串和颜色
  4. 使用概率分布生成随机数
  5. 从集合中随机选择元素

Mwc256XXA64提供了高性能的随机数生成能力,适用于各种需要随机数的场景。


1 回复

以下是基于您提供的内容整理的完整示例demo,包含了pcg-mwc库的主要使用场景:

完整示例demo

// 引入必要的库
use pcg_mwc::Mwc256XXA64;
use rand::{Rng, distributions::Uniform};
use std::time::Instant;

fn main() {
    // 示例1: 基本使用
    println!("=== 基本使用示例 ===");
    basic_usage();
    
    // 示例2: 使用特定种子
    println!("\n=== 使用特定种子示例 ===");
    seeded_usage();
    
    // 示例3: 生成不同类型随机数
    println!("\n=== 生成不同类型随机数 ===");
    different_types();
    
    // 示例4: 与rand库集成
    println!("\n=== 与rand库集成 ===");
    rand_integration();
    
    // 示例5: 性能测试
    println!("\n=== 性能测试 ===");
    performance_test();
}

// 示例1: 基本使用
fn basic_usage() {
    let mut rng = Mwc256XXA64::default();
    
    // 生成随机u64
    println!("随机u64: {}", rng.next_u64());
    
    // 生成范围随机数(0-99)
    println!("0-99之间的随机数: {}", rng.next_u64() % 100);
    
    // 生成随机布尔值
    println!("随机布尔值: {}", rng.next_u64() % 2 == 0);
}

// 示例2: 使用特定种子
fn seeded_usage() {
    let seed = 12345;
    let mut rng = Mwc256XXA64::new(seed);
    
    // 每次运行都会生成相同的序列
    println!("确定性随机数1: {}", rng.next_u64());
    println!("确定性随机数2: {}", rng.next_u64());
}

// 示例3: 生成不同类型随机数
fn different_types() {
    let mut rng = Mwc256XXA64::default();
    
    // 随机浮点数 [0.0, 1.0)
    println!("随机f64: {}", rng.next_f64());
    
    // 随机字节数组
    let mut bytes = [0u8; 8];
    rng.fill_bytes(&mut bytes);
    println!("随机字节: {:?}", bytes);
}

// 示例4: 与rand库集成
fn rand_integration() {
    let mut rng = Mwc256XXA64::default();
    
    // 使用Uniform分布生成1-6的随机数(骰子)
    let die = Uniform::new(1, 7);
    println!("掷骰子: {}", rng.sample(die));
    
    // 从数组中随机选择
    let fruits = ["苹果", "香蕉", "橙子", "葡萄"];
    println!("随机水果: {}", fruits[rng.gen_range(0..fruits.len())]);
    
    // 生成随机颜色RGB值
    println!("随机颜色: ({}, {}, {})", 
             rng.gen_range(0..256),
             rng.gen_range(0..256),
             rng.gen_range(0..256));
}

// 示例5: 性能测试
fn performance_test() {
    fn benchmark<R: Rng>(rng: &mut R, name: &str, iterations: u64) {
        let start = Instant::now();
        let mut sum = 0u64;
        for _ in 0..iterations {
            sum = sum.wrapping_add(rng.next_u64());
        }
        let duration = start.elapsed();
        println!("{}生成{}个随机数耗时: {:?}", name, iterations, duration);
    }

    let iterations = 10_000_000;
    let mut mwc = Mwc256XXA64::default();
    
    benchmark(&mut mwc, "MWC", iterations);
}

这个完整示例包含了pcg-mwc库的以下使用场景:

  1. 基本随机数生成
  2. 使用固定种子生成确定性序列
  3. 生成不同类型随机数(整数、浮点数、字节)
  4. 与rand库集成使用高级分布特性
  5. 简单的性能测试

您可以根据需要选择其中的部分或全部功能来使用pcg-mwc库。

回到顶部