生成随机字母和固定数字组合

4

我需要生成一个由单个字母和6位数字组成的随机序列,例如:F841257

我正在研究rand库,但似乎有些问题。

extern crate rand;

fn main() {
    println!("{:?}", rand::random::<char>());
}

打印出类似于 '\u{6ae02}' 这样的字符,以及 println!("{}", rand::random::<char>()); 会产生一些奇怪的符号。

请问有人能指导我如何实现这个功能吗?

1个回答

10

首先,一个可运行的程序:

extern crate rand;

use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let letter: char = rng.gen_range(b'A', b'Z') as char;
    let number: u32 = rng.gen_range(0, 999999);
    let s = format!("{}{:06}", letter, number);
    println!("{}", s);
}

接下来,是一个解释:

rand::random::<char>() 返回整个char范围内的随机值,也就是说,它可能返回任意的Unicode码点。这就是为什么你看到了一些奇怪的符号,这些很可能是来自于Unicode的高位平面的值。

你需要定义你要生成的边界。首先,你需要一个字母,然后你需要六个数字。一个字母是在'A'和'Z'之间任何字符,而六个数字可以用从0到999999的数字表示,打印时前面会补上零。

所以,首先,我们生成一个u8对应着ASCII中的一个字母,并将其转换为char(不幸的是,rand 库并没有提供char的范围分布函数,因此我们必须使用这样的间接方式)。

其次,我们生成一个介于0和999999之间的u32

然后,我们按照期望的格式打印它们。这里有一些此程序生成的值:V285490、Y865809、A704620。


1
也许没有为 char 提供范围分布的原因是代码点 U+D800 到 U+DFFF(对应代理项)是无效的。 - Francis Gagné
根据文档gen_range生成的范围为[low, high),不包括high。我该如何更改代码,使Z999999成为一个选项? - Sebastian
@Sebastian, rng.gen_range(0, 1000000)? - Vladimir Matveev
那会起作用。并且使用 rng.gen_range(b'A', b'Z'+1) 作为字母。我认为一个包含范围 [low, high] 的函数会很好用... - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接