diff --git a/pkg/util/rand/rand.go b/pkg/util/rand/rand.go index 25cd056e88a..4da9f6da097 100644 --- a/pkg/util/rand/rand.go +++ b/pkg/util/rand/rand.go @@ -54,3 +54,11 @@ func Seed(seed int64) { rng.rand = rand.New(rand.NewSource(seed)) } + +// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n) +// from the default Source. +func Perm(n int) []int { + rng.Lock() + defer rng.Unlock() + return rng.rand.Perm(n) +} diff --git a/pkg/util/rand/rand_test.go b/pkg/util/rand/rand_test.go index 0c76885674e..5ad109a3fa2 100644 --- a/pkg/util/rand/rand_test.go +++ b/pkg/util/rand/rand_test.go @@ -17,6 +17,7 @@ limitations under the License. package rand import ( + "math/rand" "strings" "testing" ) @@ -35,3 +36,17 @@ func TestString(t *testing.T) { } } } + +func TestPerm(t *testing.T) { + Seed(5) + rand.Seed(5) + for i := 1; i < 20; i++ { + actual := Perm(i) + expected := rand.Perm(i) + for j := 0; j < i; j++ { + if actual[j] != expected[j] { + t.Errorf("Perm call result is unexpected") + } + } + } +} diff --git a/pkg/util/slice/slice.go b/pkg/util/slice/slice.go index 281c2021c00..a9ee3ea62ea 100644 --- a/pkg/util/slice/slice.go +++ b/pkg/util/slice/slice.go @@ -18,7 +18,7 @@ limitations under the License. package slice import ( - "math/rand" + utilrand "k8s.io/kubernetes/pkg/util/rand" "sort" ) @@ -41,7 +41,7 @@ func SortStrings(s []string) []string { // order. It returns a new slice. func ShuffleStrings(s []string) []string { shuffled := make([]string, len(s)) - perm := rand.Perm(len(s)) + perm := utilrand.Perm(len(s)) for i, j := range perm { shuffled[j] = s[i] }