From d6eb6d33b63faa1d6496792c4afea25d5dc8abca Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 28 Jul 2021 13:39:50 +0200 Subject: [PATCH] Use a uniform distribution for generating random characters --- zed/src/util.rs | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/zed/src/util.rs b/zed/src/util.rs index d150e4a77d928340cfb1262e713022990a505c02..dbbb1c45987b57e72fcca630dee7f44f48b5c75d 100644 --- a/zed/src/util.rs +++ b/zed/src/util.rs @@ -66,28 +66,17 @@ impl Iterator for RandomCharIter { type Item = char; fn next(&mut self) -> Option { - if self.0.gen_bool(1.0 / 5.0) { - match self.0.gen_range(0..=2) { - 0 => Some('\t'), - 1 => Some(' '), - _ => Some('\n'), - } - } - // two-byte greek letters - else if self.0.gen_bool(1.0 / 8.0) { - Some(std::char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))).unwrap()) - } - // three-byte characters - else if self.0.gen_bool(1.0 / 10.0) { - ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).cloned() - } - // four-byte characters - else if self.0.gen_bool(1.0 / 12.0) { - ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).cloned() - } - // ascii letters - else { - Some(self.0.gen_range(b'a'..b'z' + 1).into()) + match self.0.gen_range(0..100) { + // whitespace + 0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(), + // two-byte greek letters + 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))), + // three-byte characters + 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(), + // four-byte characters + 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(), + // ascii letters + _ => Some(self.0.gen_range(b'a'..b'z' + 1).into()), } } }