Rust生成随机数的项目实践

 更新时间:2024年03月14日 10:58:57   作者:IAKSH  
Rust标准库中并没有随机数生成器,常见的解决方案是使用rand包,本文主要介绍了Rust生成随机数的项目实践,具有一定的参考价值,感兴趣的可以了解一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

Rust标准库中并没有随机数生成器,想要实现此类功能,你需要自行设计(纯Rust或FFI到C),或者使用第三方包。
一个常见的解决方案是使用rand包,该项目基于Apache-2.0 和 MIT协议开源,且拥有完备的文档:
rust-random/rand: A Rust library for random number generation. (github.com)

0x00 | 在Cargo中导入

Cargo.toml[dependencies]下加入以下内容即可:

rand = "*"

整个文件看起来会象是这样:

[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "*"

0x01 | 生成随机数

rand包提供了rand::Rng以生成随机数,这是一个随机数生成器,它的使用是这样的:

use rand::Rng;

fn main() {
	let mut rng = rand::thread_rng();
	let i: i32 = rng.gen();
	let f: f32 = rng.gen();
	println!("i={},f={}",i,f);
	println!("random u8: {}",rng.gen::<u8>());
	println!("random u32: {}",rng.gen::<u32>());
}

0x02 | 给定范围生成随机数

Rng::gen_range函数能够在一个左闭又开的区间内生成随机值:

use rand::Rng;

fn main() {
	let mut rng = rand::thread_rng();
	println!("random integer: {}",rng.gen_range(0..10)); // 在[0,10)内生成随机整数
	println!("random float: {}",rng.gen_range(0.0..10.0)); // 在[0,10)内生成随机浮点数
}

Rng::gen_range函数使用方便,但当在相同范围内连续生成随机数时,其效果可能不尽人意。使用Uniform模块可以得到符合均匀分布的值,以改善这一问题。如下:

use rand::distributions::{Distribution, Uniform};

fn main() {
	let mut rng = rand::thread_rng();
	let die = Uniform::from(1..7);
	loop {
		let throw = die.sample(&mut rng);
		println!("Rool the die: {}",throw);
		if throw == 6 {
			break;
		}
	}
}

rand_distr是另一个包,它提供了基于rand包的数种分布模型,你可以在rand_distr - Rust (docs.rs)中找到相关信息。
以下是生成一个符合正态分布的随机数的实列:

use rand_distr::{Distribution, Normal, NormalError};
use rand::thread_rng;
  
fn main() -> Result<(), NormalError> {
    let mut rng = thread_rng();
    let normal = Normal::new(2.0,3.0)?;
    let v = normal.sample(&mut rng);
    println!("spawn random num {} from N(2,6)",v);
    Ok(())
}

0x03 | 给定类型生成随机值

rand包可以直接生成一个随机数元组:

use rand::Rng;

fn main() {
	let mut rng = rand::thread_rng();
	let rand_tuple = rng.gen::<(i32,bool,f64)>();
	println!("Random tuple: {:?}",rand_tuple);
}

不过这种方法并不能指定随机数的范围,如果你真的需要限制其范围,可能需要手动生成每一个值。比如:

use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let rand_tuple = (
        rng.gen_range(0..100),
        rng.gen::<bool>(),
        rng.gen_range(0.0..1.0)
    );
    println!("Random tuple: {:?}", rand_tuple);
}

rand包也允许你通过为Standard类实现Distribution特性以将随机数生成器集成到你的类中,如下:

use rand::Rng;
use rand::distributions::{Distribution, Standard};

#[derive(Debug)]
struct Point {
	x: i32,
	y: i32
}

impl Distribution<Point> for Standard {
	fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Point {
		let (rand_x,rand_y) = rng.gen();
		Point {
			x: rand_x,
			y: rand_y
		}
	}
}

fn main() {
	let mut rng = rand::thread_rng();
	let rand_point: Point = rng.gen();
	println!("Random Point: {:?}",rand_point);
}

通过修改sample函数可以进一步指定范围和分布模型。

0x04 | 生成随机字符串

rand包可以生成一个指定长度的随机ASCII字符串,其样本为A-Z,a-z,0-9
一个生成包含30个ASCII字符的随机字符串的例子如下:

use rand::{thread_rng, Rng};
use rand::distributions::Alphanumeric;

fn main() {
	let rand_string: String = thread_rng()
		.sample_iter(&Alphanumeric)
		.take(30)
		.map(char::from)
		.collect();

	println!("{}", rand_string);
}

当然,也可以从指定的字符集中生成随机字符串:

use rand::Rng;

fn main() {
    const CHARSET: &[u8] = b"123ABC?!";
    let mut rng = rand::thread_rng();
    let password: String = (0..30)
        .map(|_| {
            let idx = rng.gen_range(0..CHARSET.len());
            CHARSET[idx] as char
        })
        .collect();
        
    println!("{:?}", password);
}

参考:
生成随机值 - Rust Cookbook 中文版 (rustwiki.org)

到此这篇关于Rust生成随机数的项目实践的文章就介绍到这了,更多相关Rust生成随机数内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • 利用rust编一个静态博客工具

    利用rust编一个静态博客工具

    这篇文章主要为大家详细介绍了如何利用rust编一个静态博客工具,这个静态博客的工具主要是把md文档转为html静态网站/博客,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 深入探究在Rust中函数、方法和关联函数有什么区别

    深入探究在Rust中函数、方法和关联函数有什么区别

    在 Rust 中,函数、方法和关联函数都是用来封装行为的,它们之间的区别主要在于它们的定义和调用方式,本文将通过一个简单的rust代码示例来给大家讲讲Rust中函数、方法和关联函数区别,需要的朋友可以参考下
    2023-08-08
  • Rust 智能指针实现方法

    Rust 智能指针实现方法

    这篇文章主要介绍了Rust 智能指针的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 聊聊Rust 运算符

    聊聊Rust 运算符

    运算符 用于对数据执行一些操作。被运算符执行操作的数据我们称之为操作数。下面通过本文给大家介绍Rust 运算符的相关知识,感兴趣的朋友一起看看吧
    2021-11-11
  • Rust中的宏之声明宏和过程宏详解

    Rust中的宏之声明宏和过程宏详解

    Rust中的宏是一种强大的工具,可以帮助开发人员编写可重用、高效和灵活的代码,这篇文章主要介绍了Rust中的宏:声明宏和过程宏,需要的朋友可以参考下
    2023-04-04
  • rust开发环境配置详细教程

    rust开发环境配置详细教程

    rust是一门比较新的编程语言,2015年5月15日,Rust编程语言核心团队正式宣布发布Rust 1.0版本,这篇文章主要介绍了rust开发环境配置 ,需要的朋友可以参考下
    2022-12-12
  • rust中的match表达式使用详解

    rust中的match表达式使用详解

    在rust中提供了一个极为强大的控制流运算符match,这篇文章主要介绍了rust中的match表达式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Rust?语言println!?宏的格式占位符详解

    Rust?语言println!?宏的格式占位符详解

    这篇文章主要介绍了Rust语言的println!宏的格式占位符,这只是格式说明符的一部分清单,Rust?的格式化系统非常灵活和强大,支持更多的选项和组合,需要的朋友可以参考下
    2024-03-03
  • Rust 中解析 JSON的方法

    Rust 中解析 JSON的方法

    要开始在 Rust 中使用 JSON,您需要安装一个可以轻松操作 JSON 的库,目前可用的流行crate之一是 serde-json,在本文中,我们将讨论如何在 Rust 中使用 JSON 解析库,以及比较最流行的库及其性能
    2024-03-03
  • rust智能指针的具体使用

    rust智能指针的具体使用

    智能指针是一些数据结构,它们的行为类似于指针但拥有额外的元数据和附加功能,本文就来介绍一下rust智能指针的具体使用,感兴趣的可以了解一下
    2023-12-12

最新评论

?


http://www.vxiaotou.com