The `Sample` trait is designed to allow a distribution like (not tested)

```rust
/// Randomly generate `T` from a finite list without replacement, 
/// restarting from the beginning when exhaused.
struct RecycleList<T> {
     unused: ~[T],
     used: ~[T]
}

impl<T: Clone> Sample<T> for RecycleList<T> {
    fn sample<R: Rng>(&mut self, rng: &mut R) -> T {
        let RecycleList { unused: ref mut unused, used: ref mut used } = *self;
        if unused.is_empty() {
            // reached the end of this cycle, so move all the used ones back to unused
            util::swap(unused, used);
        }

        let idx = rng.gen_range(0, unused.len());
        let elem = unused.swap_remove(i); // order doesn't matter
        used.push(elem.clone());
        elem
    }
}
```

This is not possible with a `&self` method, and the reason for having two traits. (`IndependentSample`/`ind_sample` is named as such because the immutable `&self` means that successive samples will have the same distribution as it cannot record any state (this is ignoring things like `@mut` of course).)

Everything that implements `IndependentSample` also implements `Sample` to give maximum flexibility.

All that said, I'm not sure if it's worth having two traits; there's an XXX in `rand/distributions/mod.rs` about this.