Use gen_range instead of rand::choose (#527)

This commit is contained in:
lzutao 2019-04-16 11:13:45 +07:00 committed by Andrew Gauger
parent 353ccf46cc
commit 99e3d6b333

View file

@ -2,25 +2,30 @@
[![rand-badge]][rand] [![cat-os-badge]][cat-os]
Randomly generates a string of given length ASCII characters with custom user-defined bytestring, with [`choose`].
Randomly generates a string of given length ASCII characters with custom
user-defined bytestring, with [`gen_range`].
```rust
extern crate rand;
use rand::seq::SliceRandom;
fn main() {
const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
abcdefghijklmnopqrstuvwxyz\
0123456789)(*&^%$#@!~";
use rand::Rng;
const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
abcdefghijklmnopqrstuvwxyz\
0123456789)(*&^%$#@!~";
const PASSWORD_LEN: usize = 30;
let mut rng = rand::thread_rng();
let password: Option<String> = (0..30)
.map(|_| Some(*CHARSET.choose(&mut rng)? as char))
let password: String = (0..PASSWORD_LEN)
.map(|_| {
let idx = rng.gen_range(0, CHARSET.len());
// This is safe because `idx` is in range of `CHARSET`
char::from(unsafe { *CHARSET.get_unchecked(idx) })
})
.collect();
println!("{:?}", password);
}
```
[`choose`]: https://docs.rs/rand/*/rand/trait.Rng.html#method.choose
[`gen_range`]: https://docs.rs/rand/*/rand/trait.Rng.html#method.gen_range