Skip to content

Commit e6a123b

Browse files
committed
---
yaml --- r: 93182 b: refs/heads/try c: 148f737 h: refs/heads/master v: v3
1 parent 2792437 commit e6a123b

File tree

12 files changed

+288
-53
lines changed

12 files changed

+288
-53
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 0da105a8b7b6b1e0568e8ff20f6ff4b13cc7ecc2
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: a6d3e57dca68fde4effdda3e4ae2887aa535fcd6
5-
refs/heads/try: 1420272ddc174996c532e14623d9f897ba5e7a9d
5+
refs/heads/try: 148f737c199a5c9dd6d349751072add3cc458533
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c

branches/try/src/libextra/base64.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ mod test {
318318
use std::vec;
319319
320320
do 1000.times {
321-
let times = task_rng().gen_integer_range(1u, 100);
321+
let times = task_rng().gen_range(1u, 100);
322322
let v = vec::from_fn(times, |_| random::<u8>());
323323
assert_eq!(v.to_base64(STANDARD).from_base64().unwrap(), v);
324324
}

branches/try/src/libextra/crypto/cryptoutil.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ pub mod test {
365365
digest.reset();
366366

367367
while count < total_size {
368-
let next: uint = rng.gen_integer_range(0, 2 * blocksize + 1);
368+
let next: uint = rng.gen_range(0, 2 * blocksize + 1);
369369
let remaining = total_size - count;
370370
let size = if next > remaining { remaining } else { next };
371371
digest.input(buffer.slice_to(size));

branches/try/src/libextra/flate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ mod tests {
113113
let mut r = rand::rng();
114114
let mut words = ~[];
115115
do 20.times {
116-
let range = r.gen_integer_range(1u, 10);
116+
let range = r.gen_range(1u, 10);
117117
words.push(r.gen_vec::<u8>(range));
118118
}
119119
do 20.times {

branches/try/src/libextra/sort.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,8 +1069,8 @@ mod big_tests {
10691069
isSorted(arr);
10701070

10711071
do 3.times {
1072-
let i1 = rng.gen_integer_range(0u, n);
1073-
let i2 = rng.gen_integer_range(0u, n);
1072+
let i1 = rng.gen_range(0u, n);
1073+
let i2 = rng.gen_range(0u, n);
10741074
arr.swap(i1, i2);
10751075
}
10761076
tim_sort(arr); // 3sort
@@ -1088,7 +1088,7 @@ mod big_tests {
10881088
isSorted(arr);
10891089

10901090
do (n/100).times {
1091-
let idx = rng.gen_integer_range(0u, n);
1091+
let idx = rng.gen_range(0u, n);
10921092
arr[idx] = rng.gen();
10931093
}
10941094
tim_sort(arr);
@@ -1141,8 +1141,8 @@ mod big_tests {
11411141
isSorted(arr);
11421142

11431143
do 3.times {
1144-
let i1 = rng.gen_integer_range(0u, n);
1145-
let i2 = rng.gen_integer_range(0u, n);
1144+
let i1 = rng.gen_range(0u, n);
1145+
let i2 = rng.gen_range(0u, n);
11461146
arr.swap(i1, i2);
11471147
}
11481148
tim_sort(arr); // 3sort
@@ -1160,7 +1160,7 @@ mod big_tests {
11601160
isSorted(arr);
11611161

11621162
do (n/100).times {
1163-
let idx = rng.gen_integer_range(0u, n);
1163+
let idx = rng.gen_range(0u, n);
11641164
arr[idx] = @rng.gen();
11651165
}
11661166
tim_sort(arr);

branches/try/src/libextra/treemap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ mod test_treemap {
10281028
}
10291029

10301030
do 30.times {
1031-
let r = rng.gen_integer_range(0, ctrl.len());
1031+
let r = rng.gen_range(0, ctrl.len());
10321032
let (key, _) = ctrl.remove(r);
10331033
assert!(map.remove(&key));
10341034
check_structure(&map);

branches/try/src/libstd/rand/distributions.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
use num;
2424
use rand::{Rng,Rand};
2525

26+
pub use self::range::Range;
27+
28+
pub mod range;
29+
2630
/// Things that can be used to create a random instance of `Support`.
2731
pub trait Sample<Support> {
2832
/// Generate a random value of `Support`, using `rng` as the

branches/try/src/libstd/rand/mod.rs

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,20 @@ fn main () {
5555
use mem::size_of;
5656
use unstable::raw::Slice;
5757
use cast;
58+
use cmp::Ord;
5859
use container::Container;
5960
use iter::{Iterator, range};
6061
use local_data;
6162
use prelude::*;
6263
use str;
63-
use u64;
6464
use vec;
6565

6666
pub use self::isaac::{IsaacRng, Isaac64Rng};
6767
pub use self::os::OSRng;
6868

69+
use self::distributions::{Range, IndependentSample};
70+
use self::distributions::range::SampleRange;
71+
6972
pub mod distributions;
7073
pub mod isaac;
7174
pub mod os;
@@ -218,14 +221,14 @@ pub trait Rng {
218221
vec::from_fn(len, |_| self.gen())
219222
}
220223

221-
/// Generate a random primitive integer in the range [`low`,
222-
/// `high`). Fails if `low >= high`.
224+
/// Generate a random value in the range [`low`, `high`). Fails if
225+
/// `low >= high`.
223226
///
224-
/// This gives a uniform distribution (assuming this RNG is itself
225-
/// uniform), even for edge cases like `gen_integer_range(0u8,
226-
/// 170)`, which a naive modulo operation would return numbers
227-
/// less than 85 with double the probability to those greater than
228-
/// 85.
227+
/// This is a convenience wrapper around
228+
/// `distributions::Range`. If this function will be called
229+
/// repeatedly with the same arguments, one should use `Range`, as
230+
/// that will amortize the computations that allow for perfect
231+
/// uniformity, as they only happen on initialization.
229232
///
230233
/// # Example
231234
///
@@ -235,22 +238,15 @@ pub trait Rng {
235238
///
236239
/// fn main() {
237240
/// let mut rng = rand::task_rng();
238-
/// let n: uint = rng.gen_integer_range(0u, 10);
241+
/// let n: uint = rng.gen_range(0u, 10);
239242
/// println!("{}", n);
240-
/// let m: int = rng.gen_integer_range(-40, 400);
243+
/// let m: float = rng.gen_range(-40.0, 1.3e5);
241244
/// println!("{}", m);
242245
/// }
243246
/// ```
244-
fn gen_integer_range<T: Rand + Int>(&mut self, low: T, high: T) -> T {
245-
assert!(low < high, "RNG.gen_integer_range called with low >= high");
246-
let range = (high - low).to_u64().unwrap();
247-
let accept_zone = u64::max_value - u64::max_value % range;
248-
loop {
249-
let rand = self.gen::<u64>();
250-
if rand < accept_zone {
251-
return low + NumCast::from(rand % range).unwrap();
252-
}
253-
}
247+
fn gen_range<T: Ord + SampleRange>(&mut self, low: T, high: T) -> T {
248+
assert!(low < high, "Rng.gen_range called with low >= high");
249+
Range::new(low, high).ind_sample(self)
254250
}
255251

256252
/// Return a bool with a 1 in n chance of true
@@ -267,7 +263,7 @@ pub trait Rng {
267263
/// }
268264
/// ```
269265
fn gen_weighted_bool(&mut self, n: uint) -> bool {
270-
n == 0 || self.gen_integer_range(0, n) == 0
266+
n == 0 || self.gen_range(0, n) == 0
271267
}
272268

273269
/// Return a random string of the specified length composed of
@@ -317,7 +313,7 @@ pub trait Rng {
317313
if values.is_empty() {
318314
None
319315
} else {
320-
Some(&values[self.gen_integer_range(0u, values.len())])
316+
Some(&values[self.gen_range(0u, values.len())])
321317
}
322318
}
323319

@@ -368,7 +364,7 @@ pub trait Rng {
368364
if total == 0u {
369365
return None;
370366
}
371-
let chosen = self.gen_integer_range(0u, total);
367+
let chosen = self.gen_range(0u, total);
372368
let mut so_far = 0u;
373369
for item in v.iter() {
374370
so_far += item.weight;
@@ -447,7 +443,7 @@ pub trait Rng {
447443
// invariant: elements with index >= i have been locked in place.
448444
i -= 1u;
449445
// lock element i in place.
450-
values.swap(i, self.gen_integer_range(0u, i + 1u));
446+
values.swap(i, self.gen_range(0u, i + 1u));
451447
}
452448
}
453449

@@ -473,7 +469,7 @@ pub trait Rng {
473469
continue
474470
}
475471

476-
let k = self.gen_integer_range(0, i + 1);
472+
let k = self.gen_range(0, i + 1);
477473
if k < reservoir.len() {
478474
reservoir[k] = elem
479475
}
@@ -760,36 +756,36 @@ mod test {
760756
}
761757

762758
#[test]
763-
fn test_gen_integer_range() {
759+
fn test_gen_range() {
764760
let mut r = rng();
765761
for _ in range(0, 1000) {
766-
let a = r.gen_integer_range(-3i, 42);
762+
let a = r.gen_range(-3i, 42);
767763
assert!(a >= -3 && a < 42);
768-
assert_eq!(r.gen_integer_range(0, 1), 0);
769-
assert_eq!(r.gen_integer_range(-12, -11), -12);
764+
assert_eq!(r.gen_range(0, 1), 0);
765+
assert_eq!(r.gen_range(-12, -11), -12);
770766
}
771767

772768
for _ in range(0, 1000) {
773-
let a = r.gen_integer_range(10, 42);
769+
let a = r.gen_range(10, 42);
774770
assert!(a >= 10 && a < 42);
775-
assert_eq!(r.gen_integer_range(0, 1), 0);
776-
assert_eq!(r.gen_integer_range(3_000_000u, 3_000_001), 3_000_000);
771+
assert_eq!(r.gen_range(0, 1), 0);
772+
assert_eq!(r.gen_range(3_000_000u, 3_000_001), 3_000_000);
777773
}
778774

779775
}
780776

781777
#[test]
782778
#[should_fail]
783-
fn test_gen_integer_range_fail_int() {
779+
fn test_gen_range_fail_int() {
784780
let mut r = rng();
785-
r.gen_integer_range(5i, -2);
781+
r.gen_range(5i, -2);
786782
}
787783

788784
#[test]
789785
#[should_fail]
790-
fn test_gen_integer_range_fail_uint() {
786+
fn test_gen_range_fail_uint() {
791787
let mut r = rng();
792-
r.gen_integer_range(5u, 2u);
788+
r.gen_range(5u, 2u);
793789
}
794790

795791
#[test]
@@ -894,7 +890,7 @@ mod test {
894890
let mut r = task_rng();
895891
r.gen::<int>();
896892
assert_eq!(r.shuffle(~[1, 1, 1]), ~[1, 1, 1]);
897-
assert_eq!(r.gen_integer_range(0u, 1u), 0u);
893+
assert_eq!(r.gen_range(0u, 1u), 0u);
898894
}
899895

900896
#[test]

0 commit comments

Comments
 (0)