我需要生成一个由单个字母和6位数字组成的随机序列,例如:F841257
我正在研究rand
库,但似乎有些问题。
extern crate rand;
fn main() {
println!("{:?}", rand::random::<char>());
}
打印出类似于 '\u{6ae02}'
这样的字符,以及 println!("{}", rand::random::<char>());
会产生一些奇怪的符号。
请问有人能指导我如何实现这个功能吗?
首先,一个可运行的程序:
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。
char
提供范围分布的原因是代码点 U+D800 到 U+DFFF(对应代理项)是无效的。 - Francis Gagnégen_range
生成的范围为[low, high),不包括high。我该如何更改代码,使Z999999成为一个选项? - Sebastianrng.gen_range(0, 1000000)
? - Vladimir Matveevrng.gen_range(b'A', b'Z'+1)
作为字母。我认为一个包含范围 [low, high] 的函数会很好用... - Sebastian