1 // Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! The implementations of `Rand` for the built-in types.
20 fn rand
<R
: Rng
>(rng
: &mut R
) -> isize {
21 if mem
::size_of
::<isize>() == 4 {
22 rng
.gen
::<i32>() as isize
24 rng
.gen
::<i64>() as isize
31 fn rand
<R
: Rng
>(rng
: &mut R
) -> i8 {
38 fn rand
<R
: Rng
>(rng
: &mut R
) -> i16 {
45 fn rand
<R
: Rng
>(rng
: &mut R
) -> i32 {
52 fn rand
<R
: Rng
>(rng
: &mut R
) -> i64 {
59 fn rand
<R
: Rng
>(rng
: &mut R
) -> usize {
60 if mem
::size_of
::<usize>() == 4 {
61 rng
.gen
::<u32>() as usize
63 rng
.gen
::<u64>() as usize
70 fn rand
<R
: Rng
>(rng
: &mut R
) -> u8 {
77 fn rand
<R
: Rng
>(rng
: &mut R
) -> u16 {
84 fn rand
<R
: Rng
>(rng
: &mut R
) -> u32 {
91 fn rand
<R
: Rng
>(rng
: &mut R
) -> u64 {
96 macro_rules
! float_impls
{
97 ($mod_name
:ident
, $ty
:ty
, $mantissa_bits
:expr
, $method_name
:ident
) => {
99 use {Rand, Rng, Open01, Closed01}
;
101 const SCALE
: $ty
= (1u64 << $mantissa_bits
) as $ty
;
104 /// Generate a floating point number in the half-open
105 /// interval `[0,1)`.
107 /// See `Closed01` for the closed interval `[0,1]`,
108 /// and `Open01` for the open interval `(0,1)`.
110 fn rand
<R
: Rng
>(rng
: &mut R
) -> $ty
{
114 impl Rand
for Open01
<$ty
> {
116 fn rand
<R
: Rng
>(rng
: &mut R
) -> Open01
<$ty
> {
117 // add a small amount (specifically 2 bits below
118 // the precision of f64/f32 at 1.0), so that small
119 // numbers are larger than 0, but large numbers
120 // aren't pushed to/above 1.
121 Open01(rng
.$
method_name() + 0.25 / SCALE
)
124 impl Rand
for Closed01
<$ty
> {
126 fn rand
<R
: Rng
>(rng
: &mut R
) -> Closed01
<$ty
> {
127 // rescale so that 1.0 - epsilon becomes 1.0
129 Closed01(rng
.$
method_name() * SCALE
/ (SCALE
- 1.0))
135 float_impls
! { f64_rand_impls, f64, 53, next_f64 }
136 float_impls
! { f32_rand_impls, f32, 24, next_f32 }
140 fn rand
<R
: Rng
>(rng
: &mut R
) -> char {
142 const CHAR_MASK
: u32 = 0x001f_ffff;
144 // Rejection sampling. About 0.2% of numbers with at most
145 // 21-bits are invalid codepoints (surrogates), so this
146 // will succeed first go almost every time.
147 match char::from_u32(rng
.next_u32() & CHAR_MASK
) {
157 fn rand
<R
: Rng
>(rng
: &mut R
) -> bool
{
158 rng
.gen
::<u8>() & 1 == 1
162 macro_rules
! tuple_impl
{
163 // use variables to indicate the arity of the tuple
164 ($
($tyvar
:ident
),* ) => {
165 // the trailing commas are for the 1 tuple
168 > Rand
for ( $
( $tyvar
),* , ) {
171 fn rand
<R
: Rng
>(_rng
: &mut R
) -> ( $
( $tyvar
),* , ) {
173 // use the $tyvar's to get the appropriate number of
174 // repeats (they're not actually needed)
187 fn rand
<R
: Rng
>(_
: &mut R
) -> () {
194 tuple_impl
!{A, B, C, D}
195 tuple_impl
!{A, B, C, D, E}
196 tuple_impl
!{A, B, C, D, E, F}
197 tuple_impl
!{A, B, C, D, E, F, G}
198 tuple_impl
!{A, B, C, D, E, F, G, H}
199 tuple_impl
!{A, B, C, D, E, F, G, H, I}
200 tuple_impl
!{A, B, C, D, E, F, G, H, I, J}
201 tuple_impl
!{A, B, C, D, E, F, G, H, I, J, K}
202 tuple_impl
!{A, B, C, D, E, F, G, H, I, J, K, L}
204 impl<T
: Rand
> Rand
for Option
<T
> {
206 fn rand
<R
: Rng
>(rng
: &mut R
) -> Option
<T
> {