diff --git a/docs/api/packages/slice.md b/docs/api/packages/slice.md index 531643b..3bd3f4d 100644 --- a/docs/api/packages/slice.md +++ b/docs/api/packages/slice.md @@ -2488,4 +2488,35 @@ func main() { // [[2 4] [1 3 5]] // [[1 2] [3 4] [5]] } +``` + + +### Random + +
随机返回切片中元素以及下标, 当切片长度为0时返回下标-1
+ +函数签名: + +```go +func Random[T any](slice []T) (val T, idx int) +``` + +示例:[运行](TODO) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + nums := []int{1, 2, 3, 4, 5} + + val, idx := slice.Random(nums) + if idx >= 0 && idx < len(nums) && slice.Contain(nums, val) { + fmt.Println("okk") + } + // Output: + // okk +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/slice.md b/docs/en/api/packages/slice.md index 4df2b1c..5cb0134 100644 --- a/docs/en/api/packages/slice.md +++ b/docs/en/api/packages/slice.md @@ -2486,4 +2486,34 @@ func main() { // [[2 4] [1 3 5]] // [[1 2] [3 4] [5]] } +``` + +### Random + +Random get a random item of slice, return idx=-1 when slice is empty.
+ +Signature: + +```go +func Random[T any](slice []T) (val T, idx int) +``` + +Example:[Run](TODO) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + nums := []int{1, 2, 3, 4, 5} + + val, idx := slice.Random(nums) + if idx >= 0 && idx < len(nums) && slice.Contain(nums, val) { + fmt.Println("okk") + } + // Output: + // okk +} ``` \ No newline at end of file diff --git a/slice/slice.go b/slice/slice.go index 6cacc8b..fd10970 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -12,6 +12,7 @@ import ( "strings" "time" + "github.com/duke-git/lancet/v2/random" "golang.org/x/exp/constraints" ) @@ -1229,3 +1230,14 @@ func Partition[T any](slice []T, predicates ...func(item T) bool) [][]T { return result } + +// Random get a random item of slice, return idx=-1 when slice is empty +// Play: todo +func Random[T any](slice []T) (val T, idx int) { + if len(slice) == 0 { + return val, -1 + } + + idx = random.RandInt(0, len(slice)) + return slice[idx], idx +} diff --git a/slice/slice_example_test.go b/slice/slice_example_test.go index a5e7049..e495634 100644 --- a/slice/slice_example_test.go +++ b/slice/slice_example_test.go @@ -1063,3 +1063,14 @@ func ExamplePartition() { // [[2 4] [1 3 5]] // [[1 2] [3 4] [5]] } + +func ExampleRandom() { + nums := []int{1, 2, 3, 4, 5} + + val, idx := Random(nums) + if idx >= 0 && idx < len(nums) && Contain(nums, val) { + fmt.Println("okk") + } + // Output: + // okk +} diff --git a/slice/slice_test.go b/slice/slice_test.go index 2284674..5f3c81c 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -1185,3 +1185,28 @@ func TestPartition(t *testing.T) { assert.Equal([][]int{{2, 4}, {1, 3, 5}}, Partition([]int{1, 2, 3, 4, 5}, func(n int) bool { return n%2 == 0 })) assert.Equal([][]int{{1, 2}, {3, 4}, {5}}, Partition([]int{1, 2, 3, 4, 5}, func(n int) bool { return n == 1 || n == 2 }, func(n int) bool { return n == 2 || n == 3 || n == 4 })) } + +func TestRandom(t *testing.T) { + t.Parallel() + assert := internal.NewAssert(t, "TestRandom") + + var arr []int + var val, idx int + + _, idx = Random(arr) + assert.Equal(-1, idx) + + arr = []int{} + _, idx = Random(arr) + assert.Equal(-1, idx) + + arr = []int{1} + val, idx = Random(arr) + assert.Equal(0, idx) + assert.Equal(arr[idx], val) + + arr = []int{1, 2, 3} + val, idx = Random(arr) + assert.Greater(len(arr), idx) + assert.Equal(arr[idx], val) +}