mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
rand: move the shuffle function from arrays to rand.util (#8587)
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
module util
|
||||
|
||||
import rand
|
||||
import arrays
|
||||
|
||||
// sample_nr returns a sample of the array without replacement. This means the indices cannot repeat and it restricts the sample size to be less than or equal to the size of the given array. Note that if the array has repeating elements, then the sample may have repeats as well.
|
||||
pub fn sample_nr<T>(array []T, k int) []T {
|
||||
@@ -18,7 +17,7 @@ pub fn sample_nr<T>(array []T, k int) []T {
|
||||
for i, mut v in indices {
|
||||
v = i
|
||||
}
|
||||
arrays.shuffle<int>(mut indices, k)
|
||||
shuffle(mut indices, k)
|
||||
for i in 0 .. k {
|
||||
results[i] = array[indices[i]]
|
||||
}
|
||||
@@ -34,3 +33,19 @@ pub fn sample_r<T>(array []T, k int) []T {
|
||||
}
|
||||
return results
|
||||
}
|
||||
|
||||
// shuffle randomizes the first `n` items of an array in place (all if `n` is 0)
|
||||
[direct_array_access]
|
||||
pub fn shuffle<T>(mut a []T, n int) {
|
||||
if n < 0 || n > a.len {
|
||||
panic("argument 'n' must be in range [0, a.len]")
|
||||
}
|
||||
cnt := if n == 0 { a.len - 1 } else { n }
|
||||
for i in 0 .. cnt {
|
||||
x := rand.int_in_range(i, a.len)
|
||||
// swap
|
||||
a_i := a[i]
|
||||
a[i] = a[x]
|
||||
a[x] = a_i
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import rand
|
||||
import rand.util
|
||||
|
||||
fn test_sample_nr() {
|
||||
@@ -29,3 +30,28 @@ fn test_sample_r() {
|
||||
assert element in a
|
||||
}
|
||||
}
|
||||
|
||||
fn test_shuffle() {
|
||||
rand.seed([u32(1), 2]) // set seed to produce same results in order
|
||||
a := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
mut b := a.clone()
|
||||
mut c := a.clone()
|
||||
util.shuffle(mut b, 0)
|
||||
util.shuffle(mut c, 0)
|
||||
assert b == [6, 4, 5, 1, 9, 2, 10, 3, 8, 7]
|
||||
assert c == [1, 6, 5, 8, 7, 2, 10, 9, 3, 4]
|
||||
// test shuffling a slice
|
||||
mut d := a.clone()
|
||||
util.shuffle(mut d[..5], 0)
|
||||
assert d == [5, 2, 1, 3, 4, 6, 7, 8, 9, 10]
|
||||
assert d[5..] == a[5..]
|
||||
// test shuffling n items
|
||||
mut e := a.clone()
|
||||
util.shuffle(mut e, 5)
|
||||
assert e[..5] == [10, 3, 1, 8, 4]
|
||||
assert e[5..] == [6, 7, 5, 9, 2]
|
||||
// test shuffling empty array
|
||||
mut f := a[..0]
|
||||
util.shuffle(mut f, 0)
|
||||
assert f == []int{}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user