如何在没有标准库的情况下使用 rand crate?

问题描述

我正在使用 Rust 为 Sega Megadrive 进行嵌入式游戏开发,并且想要一个随机生成器来提高可重玩性。它可以是伪随机的:不需要任何安全措施。

我一直在查看属于“无标准库”部门的 rand crate,但我不确定如何在我的 Crate.toml 中使用它:

[dependencies]
rand = {version = "0.8.3",default-features = false}

当我禁用 default-features 时,前奏中不再有 random 功能。有 Rng 特性,但我太缺乏经验,无法弄清楚如何使用它。

解决方法

要使用没有 randstd 板条箱,您需要手动使用没有它的生成器之一。这些生成器是 OsRngSmallRng 结构。顾名思义,第一个使用操作系统的生成器,它需要 getrandom 板条箱,而 SEGA Megadrive 可能不支持该板条箱。

SmallRng 应该可以正常工作。我们不能使用 random() 函数,我们需要手动创建生成器,然后调用它的方法。

为此,我们首先必须创建一个生成器,如下所示:

let mut small_rng = SmallRng::seed_from_u64([insert your seed here]);

您也可以使用 seed_from_u32whose documentation you can find here

然后我们可以这样使用它:

let rand_num = small_rng.next_u64();

重要的是,我们必须导入 RngCore trait 才能使用这些函数,如下所示:

use rand::{Rng,SeedableRng};
use rand::rngs::SmallRng;
use rand::RngCore;

SmallRng 依赖于 small_rng crate 功能,因此您应该以这种方式导入它(在 Cargo.toml 文件中):

rand = { version = "0.8.3",features = ["small_rng"],default-features = false }

我还应该留下免责声明:SmallRng 的生成器在加密方面不安全。