3
3
//! The [`Random`] trait allows generating a random value for a type using a
4
4
//! given [`RandomSource`].
5
5
6
+ use crate :: range:: RangeFull ;
7
+
6
8
/// A source of randomness.
7
9
#[ unstable( feature = "random" , issue = "130703" ) ]
8
10
pub trait RandomSource {
@@ -15,39 +17,27 @@ pub trait RandomSource {
15
17
fn fill_bytes ( & mut self , bytes : & mut [ u8 ] ) ;
16
18
}
17
19
18
- /// A trait for getting a random value for a type.
19
- ///
20
- /// **Warning:** Be careful when manipulating random values! The
21
- /// [`random`](Random::random) method on integers samples them with a uniform
22
- /// distribution, so a value of 1 is just as likely as [`i32::MAX`]. By using
23
- /// modulo operations, some of the resulting values can become more likely than
24
- /// others. Use audited crates when in doubt.
20
+ /// A trait representing a distribution of random values for a type.
25
21
#[ unstable( feature = "random" , issue = "130703" ) ]
26
- pub trait Random : Sized {
27
- /// Generates a random value.
28
- fn random ( source : & mut ( impl RandomSource + ?Sized ) ) -> Self ;
22
+ pub trait Distribution < T > {
23
+ /// Samples a random value from the distribution, using the specified random source .
24
+ fn sample ( & self , source : & mut ( impl RandomSource + ?Sized ) ) -> T ;
29
25
}
30
26
31
- impl Random for bool {
32
- fn random ( source : & mut ( impl RandomSource + ?Sized ) ) -> Self {
33
- u8:: random ( source) & 1 == 1
27
+ impl Distribution < bool > for RangeFull {
28
+ fn sample ( & self , source : & mut ( impl RandomSource + ?Sized ) ) -> bool {
29
+ let byte: u8 = RangeFull . sample ( source) ;
30
+ byte & 1 == 1
34
31
}
35
32
}
36
33
37
34
macro_rules! impl_primitive {
38
35
( $t: ty) => {
39
- impl Random for $t {
40
- /// Generates a random value.
41
- ///
42
- /// **Warning:** Be careful when manipulating the resulting value! This
43
- /// method samples according to a uniform distribution, so a value of 1 is
44
- /// just as likely as [`MAX`](Self::MAX). By using modulo operations, some
45
- /// values can become more likely than others. Use audited crates when in
46
- /// doubt.
47
- fn random( source: & mut ( impl RandomSource + ?Sized ) ) -> Self {
48
- let mut bytes = ( 0 as Self ) . to_ne_bytes( ) ;
36
+ impl Distribution <$t> for RangeFull {
37
+ fn sample( & self , source: & mut ( impl RandomSource + ?Sized ) ) -> $t {
38
+ let mut bytes = ( 0 as $t) . to_ne_bytes( ) ;
49
39
source. fill_bytes( & mut bytes) ;
50
- Self :: from_ne_bytes( bytes)
40
+ <$t> :: from_ne_bytes( bytes)
51
41
}
52
42
}
53
43
} ;
0 commit comments