【发布时间】:2020-01-01 15:07:43
【问题描述】:
我正在尝试使用 Rust 创建一个函数,给定一个整数,返回一个 String 类型的值。
我面临的主要问题是创建一个随机字符;一旦我能做到这一点,我就可以在一个循环或类似的东西中连接很多这些字符,然后返回最终的字符串。
我试图找到方法来输入从 rand crate 中的 random 函数返回的整数(就像在 C++ 中所做的那样),但这似乎不是要走的路。
我该怎么办?
【问题讨论】:
我正在尝试使用 Rust 创建一个函数,给定一个整数,返回一个 String 类型的值。
我面临的主要问题是创建一个随机字符;一旦我能做到这一点,我就可以在一个循环或类似的东西中连接很多这些字符,然后返回最终的字符串。
我试图找到方法来输入从 rand crate 中的 random 函数返回的整数(就像在 C++ 中所做的那样),但这似乎不是要走的路。
我该怎么办?
【问题讨论】:
Rust Cookbook 展示了如何优雅地完成此任务。从上面的链接复制:
use rand::{thread_rng, Rng};
use rand::distributions::Alphanumeric;
fn random_string(n: usize) -> String {
thread_rng().sample_iter(&Alphanumeric)
.take(n)
.collect()
}
如果您希望使用rand::distributions 中没有的自定义分发,您可以按照source code for one of the distributions 来实现它,看看如何自己实现它。下面是一些随机符号分布的示例实现:
use rand::{Rng, seq::SliceRandom};
use rand::distributions::Distribution;
struct Symbols;
impl Distribution<char> for Symbols {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> char {
*b"!@#$%^&*()[]{}:;".choose(rng).unwrap() as char
}
}
【讨论】:
Uniform 的实现更高效。