1#![no_std]
17
18extern crate core;
19pub extern crate rand;
20
21use core::cmp::Ordering;
22
23use rand::distributions::uniform::{SampleBorrow, SampleUniform, Uniform};
24use rand::distributions::Distribution;
25use rand::Rng;
26
27#[inline]
28fn random<N>(a: N, b: N) -> N
29where
30 N: SampleUniform + SampleBorrow<N> + Ord + Sized, {
31 let mut rng = rand::thread_rng();
32
33 random_with_rng(a, b, &mut rng)
34}
35
36#[inline]
37fn random_with_rng<N, T: Rng>(a: N, b: N, rng: &mut T) -> N
38where
39 N: SampleUniform + SampleBorrow<N> + Ord + Sized, {
40 match a.cmp(&b) {
41 Ordering::Greater => {
42 let simpler = Uniform::new_inclusive(b, a);
43
44 simpler.sample(rng)
45 }
46 Ordering::Equal => a,
47 Ordering::Less => {
48 let simpler = Uniform::new_inclusive(a, b);
49
50 simpler.sample(rng)
51 }
52 }
53}
54
55#[inline]
56pub fn random_usize(a: usize, b: usize) -> usize {
57 random(a, b)
58}
59
60#[inline]
61pub fn random_usize_with_rng<T: Rng>(a: usize, b: usize, rng: &mut T) -> usize {
62 random_with_rng(a, b, rng)
63}
64
65#[inline]
66pub fn random_u64(a: u64, b: u64) -> u64 {
67 random(a, b)
68}
69
70#[inline]
71pub fn random_u64_with_rng<T: Rng>(a: u64, b: u64, rng: &mut T) -> u64 {
72 random_with_rng(a, b, rng)
73}
74
75#[inline]
76pub fn random_u32(a: u32, b: u32) -> u32 {
77 random(a, b)
78}
79
80#[inline]
81pub fn random_u32_with_rng<T: Rng>(a: u32, b: u32, rng: &mut T) -> u32 {
82 random_with_rng(a, b, rng)
83}
84
85#[inline]
86pub fn random_u16(a: u16, b: u16) -> u16 {
87 random(a, b)
88}
89
90#[inline]
91pub fn random_u16_with_rng<T: Rng>(a: u16, b: u16, rng: &mut T) -> u16 {
92 random_with_rng(a, b, rng)
93}
94
95#[inline]
96pub fn random_u8(a: u8, b: u8) -> u8 {
97 random(a, b)
98}
99
100#[inline]
101pub fn random_u8_with_rng<T: Rng>(a: u8, b: u8, rng: &mut T) -> u8 {
102 random_with_rng(a, b, rng)
103}
104
105#[inline]
106pub fn random_isize(a: isize, b: isize) -> isize {
107 random(a, b)
108}
109
110#[inline]
111pub fn random_isize_with_rng<T: Rng>(a: isize, b: isize, rng: &mut T) -> isize {
112 random_with_rng(a, b, rng)
113}
114
115#[inline]
116pub fn random_i64(a: i64, b: i64) -> i64 {
117 random(a, b)
118}
119
120#[inline]
121pub fn random_i64_with_rng<T: Rng>(a: i64, b: i64, rng: &mut T) -> i64 {
122 random_with_rng(a, b, rng)
123}
124
125#[inline]
126pub fn random_i32(a: i32, b: i32) -> i32 {
127 random(a, b)
128}
129
130#[inline]
131pub fn random_i32_with_rng<T: Rng>(a: i32, b: i32, rng: &mut T) -> i32 {
132 random_with_rng(a, b, rng)
133}
134
135#[inline]
136pub fn random_i16(a: i16, b: i16) -> i16 {
137 random(a, b)
138}
139
140#[inline]
141pub fn random_i16_with_rng<T: Rng>(a: i16, b: i16, rng: &mut T) -> i16 {
142 random_with_rng(a, b, rng)
143}
144
145#[inline]
146pub fn random_i8(a: i8, b: i8) -> i8 {
147 random(a, b)
148}
149
150#[inline]
151pub fn random_i8_with_rng<T: Rng>(a: i8, b: i8, rng: &mut T) -> i8 {
152 random_with_rng(a, b, rng)
153}