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());
}
这个完整示例展示了:
- 基础随机数生成功能
- 使用系统时间作为种子
- 生成随机字符串和颜色
- 使用概率分布生成随机数
- 从集合中随机选择元素
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库的以下使用场景:
- 基本随机数生成
- 使用固定种子生成确定性序列
- 生成不同类型随机数(整数、浮点数、字节)
- 与rand库集成使用高级分布特性
- 简单的性能测试
您可以根据需要选择其中的部分或全部功能来使用pcg-mwc库。