【问题标题】:How do I use the rand crate without the standard library?如何在没有标准库的情况下使用 rand crate?
【发布时间】:2021-05-20 20:12:27
【问题描述】:

我正在使用 Rust 为 Sega Megadrive 进行嵌入式游戏开发,并希望使用随机数生成器来提高可重玩性。它可以是伪随机的:不需要安全的东西。

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

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

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

【问题讨论】:

  • 将该代码放在一个名为Crate.toml 的文件中将没有任何效果,因为没有人关心该文件。也许有一个简单的错字可以解决您的问题?
  • 一般来说,随机数生成器需要一个熵源——你的设备上会有什么?
  • 我一直用fastrand,不过我不确定它是否适用于SEGA
  • rand crate 中的 SmallRNG 似乎在没有std 的情况下也能正常工作。 Here's the documentation
  • @Misty SmallRNG 是 no_std。有了日期或任何种子,它应该可以满足 OP 声明的需求。这看起来像是一个有效的答案(只需要一个例子)

标签: random rust embedded


【解决方案1】:

要在没有std 的情况下使用rand 板条箱,您需要手动使用其中一个在没有它的情况下工作的生成器。这些生成器是 OsRngSmallRng 结构。顾名思义,第一个使用操作系统的生成器,它需要getrandom crate,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 的生成器不是加密安全的。

【讨论】:

  • 这看起来越来越接近了!编译器现在抱怨它无法编译 libc:
  • ``` 1628 | ...速度:::speed_t) -> ::c_int; | ^^^^^^^ not found in the crate root error: aborting due to 380 previous errors 有些错误有详细解释:E0412, E0573。有关错误的更多信息,请尝试rustc --explain E0412。错误:无法编译libc ``` libc 被列为可选依赖项,但看起来 small_rng 需要它...有没有明显的解决方案?
  • 顺便说一句,我没有发现对 seed_from_u32 方法的引用...但这可能无关紧要。
  • @Rein 尝试将 libc 明确列为依赖项。并确保它被列为必需的依赖项
  • 我添加了:libc = { version = "0.2.94", default-features = false, optional = false },但没有任何区别。它仍然列出相同的 380 个错误列表,全部以 not found in crate root 结尾。但我不能将它添加到根箱子,因为它是一个“虚拟”箱子。有任何想法吗?如果您想查看详细信息,我的代码在github.com/reinvantveer/rust-mega-drive/tree/main/examples/…
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2018-10-29
相关资源
最近更新 更多