当前位置: 首页 > news >正文

rust每日一库 rand 生成随机数

文章目录

  • 生成随机值
    • 生成随机数
    • 生成范围内随机数
    • 生成自定义类型随机值
    • 从一组字母数字字符创建随机密码
    • 从一组用户定义字符创建随机密码
  • 总结

生成随机值

rust中官方并没有像以他语言一样,rust并没有官方并没有提供生成随机数的工具,所以我们要借助rand包进行生成随机数。这里我们使用现在使用罪为广泛的rand包只需要引入以下依赖就能够使用。rand = "0.8.5"

生成随机数

在随机数生成器 rand::Rng 的帮助下,通过 rand::thread_rng 生成随机数。可以开启多个线程,每个线程都有一个初始化的生成器。整数在其类型范围内均匀分布,浮点数是从 0 均匀分布到 1,但不包括 1。

use rand::Rng;fn main() {let mut rng = rand::thread_rng();let n1: u8 = rng.gen();let n2: u16 = rng.gen();println!("Random u8: {}", n1);println!("Random u16: {}", n2);// 改变类型println!("Random u32: {}", rng.gen::<u32>());println!("Random i32: {}", rng.gen::<i32>());println!("Random float: {}", rng.gen::<f64>());
}

结果

Random u8: 247
Random u16: 46458
Random u32: 2649532043
Random i32: 1393744920
Random float: 0.5923489382636902

生成范围内随机数

使用 Rng::gen_range,在半开放的 [0, 10) 范围内(不包括 10)生成一个随机值。

use rand::Rng;fn main() {let mut rng = rand::thread_rng();println!("Integer: {}", rng.gen_range(0..10));println!("Float: {}", rng.gen_range(0.0..10.0));
}

结果

   let mut rng = rand::thread_rng();println!("Integer: {}", rng.gen_range(0..10));println!("Float: {}", rng.gen_range(0.0..10.0));

使用 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!("Roll the die: {}", throw);if throw == 6 {break;}}
}

结果

Roll the die: 1
Roll the die: 2
Roll the die: 6

生成自定义类型随机值

随机生成一个元组 (i32, bool, f64) 和用户定义类型为 Point 的变量。为 Standard 实现 Distribution trait,以允许随机生成。

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_tuple = rng.gen::<(i32, bool, f64)>();let rand_point: Point = rng.gen();println!("Random tuple: {:?}", rand_tuple);println!("Random Point: {:?}", rand_point);
}

结果

Random tuple: (590118681, false, 0.7548409339548463)
Random Point: Point { x: 914499268, y: 795986012 }

从一组字母数字字符创建随机密码

随机生成一个给定长度的 ASCII 字符串,范围为 A-Z,a-z,0-9,使用字母数字样本。

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);
}

结果

fwaZUzdIkK1p78fyNvh44Od5gcr3BL

从一组用户定义字符创建随机密码

使用用户自定义的字节字符串,使用 gen_range 函数,随机生成一个给定长度的 ASCII 字符串。

use rand::Rng;
fn main() {const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyz\0123456789)(*&^%$#@!~";const PASSWORD_LEN: usize = 30;let mut rng = rand::thread_rng();let password: String = (0..PASSWORD_LEN).map(|_| {let idx = rng.gen_range(0..CHARSET.len());CHARSET[idx] as char}).collect();println!("{:?}", password);
}

结果

"F@QNgOrsviJ2tqM$zOSJSR^Hjevvce"

总结

以上就是rand包的简单使用,如果想要更要了解rand包的使用,还要多查阅官方文档

相关文章:

  • 将对象转成URL参数
  • 网络编程相关面试题
  • 安装vmware_esxi 超详细
  • 什么是好的FPGA编码风格?(2)--多参考设计软件的语言模板(Language Templates)
  • 一文让你深入了解JavaSE的知识点
  • docker start一个容器之后,怎么进入这个容器界面
  • 米贸搜|Facebook海外企业户怎么引流到line上
  • 【开源视频联动物联网平台】视频接入网关的用法
  • Java第二十章多线程
  • Android自动化测试中使用ADB进行网络状态管理!
  • 游戏缺少d3dx9_43.dll修复方法分享,快速解决dll缺失问题
  • 浅学指针(3)
  • 宏定义中 ## 和 # 的作用
  • 中国信息通信研究院产业与规划研究所校招一面、二面内容
  • ChatGPT生成的一些有趣的文件管理用python小程序
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CSS盒模型深入
  • Git的一些常用操作
  • gulp 教程
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Java-详解HashMap
  • Java知识点总结(JavaIO-打印流)
  • miaov-React 最佳入门
  • spring + angular 实现导出excel
  • Vultr 教程目录
  • 第十八天-企业应用架构模式-基本模式
  • 技术胖1-4季视频复习— (看视频笔记)
  • 将 Measurements 和 Units 应用到物理学
  • 京东美团研发面经
  • 区块链技术特点之去中心化特性
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 优化 Vue 项目编译文件大小
  • 终端用户监控:真实用户监控还是模拟监控?
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 数据库巡检项
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #include<初见C语言之指针(5)>
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (11)MSP430F5529 定时器B
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Forward) Music Player: From UI Proposal to Code
  • (NSDate) 时间 (time )比较
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (过滤器)Filter和(监听器)listener
  • (实战篇)如何缓存数据
  • (万字长文)Spring的核心知识尽揽其中
  • (一)VirtualBox安装增强功能
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net CoreRabbitMQ消息存储可靠机制