【Rust自学】2.2. 猜数游戏Pt.2 生成随机数

发布时间:2026/7/23 18:45:39

【Rust自学】2.2. 猜数游戏Pt.2 生成随机数 2.2 猜数游戏Pt.2 生成随机数2.2.0 本篇知识点在本篇中你将学到:- 外部 crate 的搜索与下载- Cargo 依赖项管理- 基于语义化版本的升级规则-rand随机数生成器- ...2.2.1 游戏目标生成一个 1 到 100 间的随机数本篇会涉及提示玩家输入一个猜测猜完之后程序会提示猜测是太大了还是太小了如果猜测正确那么打印一个庆祝信息程序退出2.2.2 代码实现Step 1寻找外部库虽然 Rust 标准库内并没有提供与生成随机数相关的函数但 Rust 团队开发了具有这个功能的外部库。在 Rust 官方 crates 注册中心 中搜索rand就可以找到它。这个页面提供了非常详细的 crate 介绍。Rust 的 crate 一共分为两种-库 crateLibrary crate提供功能或逻辑模块的 crate。它没有main函数不能单独运行。通常用于与其他代码共享功能。rand这个 crate 就属于库 crate。-二进制 crateBinary crate可执行程序包含一个main函数编译后会生成可运行的二进制文件。用于构建独立、可运行的 Rust 应用程序。Step 2把这个外部 crate 写入 Cargo 依赖项接下来就需要把这个外部库写入 Cargo 依赖项有关 Cargo 的介绍在 1.3. Rust Cargo 基础知识 中已提及这里不再重复以供程序调用。打开项目中的Cargo.toml文件在dependencies下面添加依赖项格式为依赖项名 依赖项版本crate 页面的Install一栏下也有这种写法。这个程序需要rand这个依赖项并且使用0.8.5这个版本就应该写rand 0.8.5。如果这个依赖项还有自己的依赖项Cargo 就会在编译时自动下载它们。实际上0.8.5这种版本号写法是一种简写其完整写法为^0.8.5表示任何与0.8.5版本公共 API 兼容的版本都可以至少是0.8.5但低于0.9.0。比如某个依赖项的版本是1.2那就相当于^1.2.0意味着允许任意1.2.0且2.0.0的版本——因此可以解析到1.3.0等更高的1.x版本但不会升级到2.0.0或更高版本。Cargo 会把实际选中的精确版本记录在Cargo.lock中并在之后的构建中复用这些版本直到你更新依赖例如使用cargo update。如果某个依赖项的更新会破坏基于旧版本依赖项编写的代码那么重新构建后会发生什么呢答案在Cargo.lock文件中。在构建时Cargo 会检查是否已经存在Cargo.lock文件如果有就使用这个文件里指定的版本从而避免兼容性问题。如果想在当前标准下更新版本可以在终端中使用cargo update。具体步骤如下:- 复制 Cargo 项目所在路径打开终端输入cd Cargo_project_path- 输入cargo update这个命令会更新Cargo.lock向注册表查询仍然满足Cargo.toml中要求的最新依赖版本Cargo.toml里写下的版本要求本身不会改变。举个例子假如某个依赖项在Cargo.toml中声明的版本是1.2cargo update就可以把锁定的版本升级到不低于1.2.0的最新1.x.x但不会升级到2.0.0或更高版本同时Cargo.toml中写下的要求依然是1.2。Step 3在代码中使用这个依赖项在程序开头需要使用关键字use来导入依赖项:use rand::Rng;rand::Rng是一个trait。trait类似于其他语言中的接口如 Java 的接口或 C 的纯虚基类用于规定一组类型必须实现的函数和方法。rand::Rng定义了随机数生成器所需的一些方法。接下来在main中使用这个 trait 来生成随机数:let range_number rand::thread_rng().gen_range(1..101);PS在旧版本中应写为gen_range(1, 101)。let range_number声明了一个叫做range_number的不可变变量赋值rand::thread_rng()返回一个ThreadRng值它是一个随机数生成器。这个随机数生成器位于本地线程空间并通过操作系统获得种子。.gen_range(1..101)rand::thread_rng()上的一个方法它接收一个范围并在该范围内生成随机数。这里会生成从 1 开始、到但不包括 101 的数字。最后再打印出这个随机数println!的使用在 2.1 猜数游戏Pt.1 一次猜测 已作介绍这里不再重复:println!(The secret number is: {}, range_number);2.2.3 代码效果这是完整的代码:use std::io; use rand::Rng; fn main() { let range_number rand::thread_rng().gen_range(1..101); println!(Number Guessing Game); println!(Guess a number); let mut guess String::new(); io::stdin().read_line(mut guess).expect(Could not read the line); println!(The number you guessed is:{}, guess); println!(The secret number is: {}, range_number); }运行效果如下每次运行的神秘数字都会不同:Number Guessing Game Guess a number 10 The number you guessed is:10 The secret number is: 65

相关新闻