1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*!
# Random Integer
Generate a random integer between two integer numbers (including the two integer numbers).

## Example

```rust
extern crate random_integer;

let rnd = random_integer::random_u8(224, 255);

println!("{}", rnd);
```
*/

#![no_std]

extern crate core;
pub extern crate rand;

use core::cmp::Ordering;

use rand::distributions::uniform::{SampleBorrow, SampleUniform, Uniform};
use rand::distributions::Distribution;
use rand::Rng;

#[inline]
fn random<N>(a: N, b: N) -> N
where
    N: SampleUniform + SampleBorrow<N> + Ord + Sized, {
    let mut rng = rand::thread_rng();

    random_with_rng(a, b, &mut rng)
}

#[inline]
fn random_with_rng<N, T: Rng>(a: N, b: N, rng: &mut T) -> N
where
    N: SampleUniform + SampleBorrow<N> + Ord + Sized, {
    match a.cmp(&b) {
        Ordering::Greater => {
            let simpler = Uniform::new_inclusive(b, a);

            simpler.sample(rng)
        }
        Ordering::Equal => a,
        Ordering::Less => {
            let simpler = Uniform::new_inclusive(a, b);

            simpler.sample(rng)
        }
    }
}

#[inline]
pub fn random_usize(a: usize, b: usize) -> usize {
    random(a, b)
}

#[inline]
pub fn random_usize_with_rng<T: Rng>(a: usize, b: usize, rng: &mut T) -> usize {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_u64(a: u64, b: u64) -> u64 {
    random(a, b)
}

#[inline]
pub fn random_u64_with_rng<T: Rng>(a: u64, b: u64, rng: &mut T) -> u64 {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_u32(a: u32, b: u32) -> u32 {
    random(a, b)
}

#[inline]
pub fn random_u32_with_rng<T: Rng>(a: u32, b: u32, rng: &mut T) -> u32 {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_u16(a: u16, b: u16) -> u16 {
    random(a, b)
}

#[inline]
pub fn random_u16_with_rng<T: Rng>(a: u16, b: u16, rng: &mut T) -> u16 {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_u8(a: u8, b: u8) -> u8 {
    random(a, b)
}

#[inline]
pub fn random_u8_with_rng<T: Rng>(a: u8, b: u8, rng: &mut T) -> u8 {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_isize(a: isize, b: isize) -> isize {
    random(a, b)
}

#[inline]
pub fn random_isize_with_rng<T: Rng>(a: isize, b: isize, rng: &mut T) -> isize {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_i64(a: i64, b: i64) -> i64 {
    random(a, b)
}

#[inline]
pub fn random_i64_with_rng<T: Rng>(a: i64, b: i64, rng: &mut T) -> i64 {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_i32(a: i32, b: i32) -> i32 {
    random(a, b)
}

#[inline]
pub fn random_i32_with_rng<T: Rng>(a: i32, b: i32, rng: &mut T) -> i32 {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_i16(a: i16, b: i16) -> i16 {
    random(a, b)
}

#[inline]
pub fn random_i16_with_rng<T: Rng>(a: i16, b: i16, rng: &mut T) -> i16 {
    random_with_rng(a, b, rng)
}

#[inline]
pub fn random_i8(a: i8, b: i8) -> i8 {
    random(a, b)
}

#[inline]
pub fn random_i8_with_rng<T: Rng>(a: i8, b: i8, rng: &mut T) -> i8 {
    random_with_rng(a, b, rng)
}