Skip to content

Commit 9165b0e

Browse files
committed
close rust-random#194: add Sample trait and rename sample -> sample_reservoir
1 parent e3a6d82 commit 9165b0e

File tree

2 files changed

+339
-51
lines changed

2 files changed

+339
-51
lines changed

src/lib.rs

+9-51
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@
184184
//! // where the car is. The game host will never open the door with the car.
185185
//! fn game_host_open<R: Rng>(car: u32, choice: u32, rng: &mut R) -> u32 {
186186
//! let choices = free_doors(&[car, choice]);
187-
//! rand::sample(rng, choices.into_iter(), 1)[0]
187+
//! rand::sample_reservoir(rng, choices.into_iter(), 1)[0]
188188
//! }
189189
//!
190190
//! // Returns the door we switch to, given our current choice and
@@ -260,6 +260,12 @@ pub use os::OsRng;
260260

261261
pub use isaac::{IsaacRng, Isaac64Rng};
262262
pub use chacha::ChaChaRng;
263+
pub use sample::{
264+
// TODO: `sample` name will be deprecated in 1.0, use `sample_reservoir` instead
265+
sample_reservoir as sample,
266+
sample_reservoir,
267+
Sample,
268+
SampleRef};
263269

264270
#[cfg(target_pointer_width = "32")]
265271
use IsaacRng as IsaacWordRng;
@@ -276,6 +282,7 @@ pub mod reseeding;
276282
mod rand_impls;
277283
pub mod os;
278284
pub mod read;
285+
mod sample;
279286

280287
#[allow(bad_style)]
281288
type w64 = w<u64>;
@@ -1016,40 +1023,9 @@ pub fn random<T: Rand>() -> T {
10161023
thread_rng().gen()
10171024
}
10181025

1019-
/// Randomly sample up to `amount` elements from a finite iterator.
1020-
/// The order of elements in the sample is not random.
1021-
///
1022-
/// # Example
1023-
///
1024-
/// ```rust
1025-
/// use rand::{thread_rng, sample};
1026-
///
1027-
/// let mut rng = thread_rng();
1028-
/// let sample = sample(&mut rng, 1..100, 5);
1029-
/// println!("{:?}", sample);
1030-
/// ```
1031-
pub fn sample<T, I, R>(rng: &mut R, iterable: I, amount: usize) -> Vec<T>
1032-
where I: IntoIterator<Item=T>,
1033-
R: Rng,
1034-
{
1035-
let mut iter = iterable.into_iter();
1036-
let mut reservoir: Vec<T> = iter.by_ref().take(amount).collect();
1037-
// continue unless the iterator was exhausted
1038-
if reservoir.len() == amount {
1039-
for (i, elem) in iter.enumerate() {
1040-
let k = rng.gen_range(0, i + 1 + amount);
1041-
if let Some(spot) = reservoir.get_mut(k) {
1042-
*spot = elem;
1043-
}
1044-
}
1045-
}
1046-
reservoir
1047-
}
1048-
10491026
#[cfg(test)]
10501027
mod test {
1051-
use super::{Rng, thread_rng, random, SeedableRng, StdRng, sample,
1052-
weak_rng};
1028+
use super::{Rng, thread_rng, random, SeedableRng, StdRng, weak_rng};
10531029
use std::iter::repeat;
10541030

10551031
pub struct MyRng<R> { inner: R }
@@ -1255,24 +1231,6 @@ mod test {
12551231
(f32, (f64, (f64,)))) = random();
12561232
}
12571233

1258-
#[test]
1259-
fn test_sample() {
1260-
let min_val = 1;
1261-
let max_val = 100;
1262-
1263-
let mut r = thread_rng();
1264-
let vals = (min_val..max_val).collect::<Vec<i32>>();
1265-
let small_sample = sample(&mut r, vals.iter(), 5);
1266-
let large_sample = sample(&mut r, vals.iter(), vals.len() + 5);
1267-
1268-
assert_eq!(small_sample.len(), 5);
1269-
assert_eq!(large_sample.len(), vals.len());
1270-
1271-
assert!(small_sample.iter().all(|e| {
1272-
**e >= min_val && **e <= max_val
1273-
}));
1274-
}
1275-
12761234
#[test]
12771235
fn test_std_rng_seeded() {
12781236
let s = thread_rng().gen_iter::<usize>().take(256).collect::<Vec<usize>>();

0 commit comments

Comments
 (0)