Use a uniform distribution for generating random characters

Antonio Scandurra created

Change summary

zed/src/util.rs | 33 +++++++++++----------------------
1 file changed, 11 insertions(+), 22 deletions(-)

Detailed changes

zed/src/util.rs 🔗

@@ -66,28 +66,17 @@ impl<T: Rng> Iterator for RandomCharIter<T> {
     type Item = char;
 
     fn next(&mut self) -> Option<Self::Item> {
-        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()),
         }
     }
 }