migrate rand
diff --git a/src/rngs/adapter/read.rs b/src/rngs/adapter/read.rs
index a5b31cc..5b4e5f0 100644
--- a/src/rngs/adapter/read.rs
+++ b/src/rngs/adapter/read.rs
@@ -56,6 +56,12 @@
 }
 
 impl<R: Read> RngCore for ReadRng<R> {
+    fn next_bool(&mut self) -> bool {
+        let mut buf = [0; 1];
+        self.fill_bytes(&mut buf);
+        (buf[0] & 1) == 1
+    }
+
     fn next_u32(&mut self) -> u32 {
         impls::next_u32_via_fill(self)
     }
diff --git a/src/rngs/adapter/reseeding.rs b/src/rngs/adapter/reseeding.rs
index 1977cb3..6560233 100644
--- a/src/rngs/adapter/reseeding.rs
+++ b/src/rngs/adapter/reseeding.rs
@@ -106,10 +106,14 @@
 // implements RngCore, but we can't specify that because ReseedingCore is private
 impl<R, Rsdr: RngCore> RngCore for ReseedingRng<R, Rsdr>
 where
-    R: BlockRngCore<Item = u32> + SeedableRng,
-    <R as BlockRngCore>::Results: AsRef<[u32]> + AsMut<[u32]>,
+    R: BlockRngCore + SeedableRng
 {
     #[inline(always)]
+    fn next_bool(&mut self) -> bool {
+        self.0.next_bool()
+    }
+
+    #[inline(always)]
     fn next_u32(&mut self) -> u32 {
         self.0.next_u32()
     }
@@ -161,7 +165,6 @@
     R: BlockRngCore + SeedableRng,
     Rsdr: RngCore,
 {
-    type Item = <R as BlockRngCore>::Item;
     type Results = <R as BlockRngCore>::Results;
 
     fn generate(&mut self, results: &mut Self::Results) {
@@ -172,7 +175,7 @@
             // returning from a non-inlined function.
             return self.reseed_and_generate(results, global_fork_counter);
         }
-        let num_bytes = results.as_ref().len() * size_of::<Self::Item>();
+        let num_bytes = results.as_ref().len();
         self.bytes_until_reseed -= num_bytes as i64;
         self.inner.generate(results);
     }
@@ -242,7 +245,7 @@
             trace!("Reseeding RNG (periodic reseed)");
         }
 
-        let num_bytes = results.as_ref().len() * size_of::<<R as BlockRngCore>::Item>();
+        let num_bytes = results.as_ref().len();
 
         if let Err(e) = self.reseed() {
             warn!("Reseeding RNG failed: {}", e);
diff --git a/src/rngs/mock.rs b/src/rngs/mock.rs
index a1745a4..6f2ae50 100644
--- a/src/rngs/mock.rs
+++ b/src/rngs/mock.rs
@@ -47,6 +47,11 @@
 
 impl RngCore for StepRng {
     #[inline]
+    fn next_bool(&mut self) -> bool {
+        (self.next_u64() & 1) == 1
+    }
+
+    #[inline]
     fn next_u32(&mut self) -> u32 {
         self.next_u64() as u32
     }
diff --git a/src/rngs/std.rs b/src/rngs/std.rs
index a90d86f..803abac 100644
--- a/src/rngs/std.rs
+++ b/src/rngs/std.rs
@@ -38,6 +38,11 @@
 
 impl RngCore for StdRng {
     #[inline(always)]
+    fn next_bool(&mut self) -> bool {
+        self.0.next_bool()
+    }
+
+    #[inline(always)]
     fn next_u32(&mut self) -> u32 {
         self.0.next_u32()
     }
diff --git a/src/rngs/thread.rs b/src/rngs/thread.rs
index 3a216bc..f7b0cf2 100644
--- a/src/rngs/thread.rs
+++ b/src/rngs/thread.rs
@@ -94,6 +94,11 @@
 
 impl RngCore for ThreadRng {
     #[inline(always)]
+    fn next_bool(&mut self) -> bool {
+        unsafe { self.rng.as_mut().next_bool() }
+    }
+
+    #[inline(always)]
     fn next_u32(&mut self) -> u32 {
         unsafe { self.rng.as_mut().next_u32() }
     }