diff --git a/README.md b/README.md index 0a0f7c1..66ec955 100644 --- a/README.md +++ b/README.md @@ -1167,7 +1167,7 @@ import "github.com/duke-git/lancet/v2/random" - **UUIdV4** : generate a random UUID of version 4 according to RFC 4122. [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/random.md#UUIdV4)] [[play](https://go.dev/play/p/_Z9SFmr28ft)] -- **RandUniqueIntSlice** : generate a slice of random int of length n that do not repeat. +- **RandUniqueIntSlice** : generate a slice of random int that do not repeat. [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/random.md#RandUniqueIntSlice)] [[play](https://go.dev/play/p/uBkRSOz73Ec)] - **RandSymbolChar** : Generate a random symbol char of specified length. @@ -1178,7 +1178,7 @@ import "github.com/duke-git/lancet/v2/random" [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/random.md#RandFloat)] [[play](https://go.dev/play/p/zbD_tuobJtr)] -- **RandFloats** : Generate a slice of random float64 numbers of length n that do not repeat. +- **RandFloats** : Generate a slice of random float64 numbers that do not repeat. [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/random.md#RandFloats)] [[play](https://go.dev/play/p/I3yndUQ-rhh)] diff --git a/README_zh-CN.md b/README_zh-CN.md index 2ba0936..07550d7 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -1169,7 +1169,7 @@ import "github.com/duke-git/lancet/v2/random" - **UUIdV4** : 生成 UUID v4 字符串。 [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/random.md#UUIdV4)] [[play](https://go.dev/play/p/_Z9SFmr28ft)] -- **RandUniqueIntSlice** : 生成一个不重复的长度为 n 的随机 int 切片。 +- **RandUniqueIntSlice** : 生成一个不重复的随机int切片。 [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/random.md#RandUniqueIntSlice)] [[play](https://go.dev/play/p/uBkRSOz73Ec)] - **RandSymbolChar** : 生成给定长度的随机符号字符串。 diff --git a/docs/api/packages/random.md b/docs/api/packages/random.md index 3137ee1..5ee9015 100644 --- a/docs/api/packages/random.md +++ b/docs/api/packages/random.md @@ -31,6 +31,7 @@ import ( - [RandNumeralOrLetter](#RandNumeralOrLetter) - [RandSymbolChar](#RandSymbolChar) - [UUIdV4](#UUIdV4) +- [RandIntSlice](#RandIntSlice) - [RandUniqueIntSlice](#RandUniqueIntSlice) - [RandFloat](#RandFloat) - [RandFloats](#RandFloats) @@ -276,14 +277,40 @@ func main() { } ``` -### RandUniqueIntSlice +### RandIntSlice -
生成一个不重复的长度为n的随机int切片。
+生成一个特定长度的随机int切片,数值范围[min, max)。
函数签名: ```go -func RandUniqueIntSlice(n, min, max int) []int +func RandIntSlice(length, min, max int) []int +``` + +示例: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/random" +) + +func main() { + result := random.RandIntSlice(5, 0, 10) + fmt.Println(result) //[1 2 7 1 5] (random) +} +``` + +### RandUniqueIntSlice + +生成一个特定长度的,数值不重复的随机int切片,数值范围[min, max)。
+ +函数签名: + +```go +func RandUniqueIntSlice(length, min, max int) []int ``` 示例:[运行](https://go.dev/play/p/uBkRSOz73Ec) @@ -304,7 +331,7 @@ func main() { ### RandFloat -生成随机float64数字,可以指定范围和精度。
+生成一个随机float64数值,可以指定精度。数值范围[min, max)。
函数签名: @@ -330,7 +357,7 @@ func main() { ### RandFloats -生成随机float64数字切片,指定长度,范围和精度.
+生成一个特定长度的随机float64切片,可以指定数值精度。数值范围[min, max)。
函数签名: diff --git a/docs/en/api/packages/random.md b/docs/en/api/packages/random.md index 70397ce..f5eff81 100644 --- a/docs/en/api/packages/random.md +++ b/docs/en/api/packages/random.md @@ -31,6 +31,7 @@ import ( - [RandNumeralOrLetter](#RandNumeralOrLetter) - [RandSymbolChar](#RandSymbolChar) - [UUIdV4](#UUIdV4) +- [RandIntSlice](#RandIntSlice) - [RandUniqueIntSlice](#RandUniqueIntSlice) - [RandFloat](#RandFloat) - [RandFloats](#RandFloats) @@ -276,15 +277,41 @@ func main() { } ``` +### RandIntSlice -### RandUniqueIntSlice - -Generate a slice of random int of length n that do not repeat.
+Generate a slice of random int. Number range in [min, max)
Signature: ```go -func RandUniqueIntSlice(n, min, max int) []int +func RandIntSlice(length, min, max int) []int +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/random" +) + +func main() { + result := random.RandIntSlice(5, 0, 10) + fmt.Println(result) //[1 4 7 1 5] (random) +} +``` + + +### RandUniqueIntSlice + +Generate a slice of random int of length that do not repeat. Number range in [min, max)
+ +Signature: + +```go +func RandUniqueIntSlice(length, min, max int) []int ``` Example:[Run](https://go.dev/play/p/uBkRSOz73Ec) @@ -331,12 +358,12 @@ func main() { ### RandFloats -Generate a slice of random float64 numbers of length n that do not repeat.
+Generate a slice of random float64 numbers of length n that do not repeat. Number range in [min, max)
Signature: ```go -func RandFloats(n int, min, max float64, precision int) []float64 +func RandFloats(length int, min, max float64, precision int) []float64 ``` Example:[Run](https://go.dev/play/p/I3yndUQ-rhh) diff --git a/random/random.go b/random/random.go index 230feb6..0d692e8 100644 --- a/random/random.go +++ b/random/random.go @@ -42,6 +42,10 @@ func RandInt(min, max int) int { min, max = max, min } + if min == 0 && max == math.MaxInt { + return rand.Int() + } + return rand.Intn(max-min) + min } @@ -186,19 +190,35 @@ func UUIdV4() (string, error) { return fmt.Sprintf("%x-%x-%x-%x-%x", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:]), nil } -// RandUniqueIntSlice generate a slice of random int of length n that do not repeat. +// RandIntSlice generates a slice of random integers. +// The generated integers are between min and max (exclusive). +// Play: todo +func RandIntSlice(length, min, max int) []int { + if length <= 0 || min > max { + return []int{} + } + + result := make([]int, length) + for i := range result { + result[i] = RandInt(min, max) + } + + return result +} + +// RandUniqueIntSlice generate a slice of random int of length that do not repeat. // Play: https://go.dev/play/p/uBkRSOz73Ec -func RandUniqueIntSlice(n, min, max int) []int { +func RandUniqueIntSlice(length, min, max int) []int { if min > max { return []int{} } - if n > max-min { - n = max - min + if length > max-min { + length = max - min } - nums := make([]int, n) - used := make(map[int]struct{}, n) - for i := 0; i < n; { + nums := make([]int, length) + used := make(map[int]struct{}, length) + for i := 0; i < length; { r := RandInt(min, max) if _, use := used[r]; use { continue @@ -211,12 +231,12 @@ func RandUniqueIntSlice(n, min, max int) []int { return nums } -// RandFloats generate a slice of random float64 numbers of length n that do not repeat. +// RandFloats generate a slice of random float64 numbers of length that do not repeat. // Play: https://go.dev/play/p/I3yndUQ-rhh -func RandFloats(n int, min, max float64, precision int) []float64 { - nums := make([]float64, n) - used := make(map[float64]struct{}, n) - for i := 0; i < n; { +func RandFloats(length int, min, max float64, precision int) []float64 { + nums := make([]float64, length) + used := make(map[float64]struct{}, length) + for i := 0; i < length; { r := RandFloat(min, max, precision) if _, use := used[r]; use { continue diff --git a/random/random_test.go b/random/random_test.go index 036cf9b..ea7e6ae 100644 --- a/random/random_test.go +++ b/random/random_test.go @@ -196,3 +196,27 @@ func TestRandFloats(t *testing.T) { assert.Equal(len(numbers), 5) } + +func TestRandIntSlice(t *testing.T) { + t.Parallel() + assert := internal.NewAssert(t, "TestRandIntSlice") + + t.Run("empty slice", func(t *testing.T) { + numbers := RandIntSlice(-1, 1, 5) + assert.Equal([]int{}, numbers) + + numbers = RandIntSlice(0, 1, 5) + assert.Equal([]int{}, numbers) + + numbers = RandIntSlice(3, 5, 1) + assert.Equal([]int{}, numbers) + }) + + t.Run("random int slice", func(t *testing.T) { + numbers := RandIntSlice(5, 1, 1) + assert.Equal([]int{1, 1, 1, 1, 1}, numbers) + + numbers = RandIntSlice(5, 1, 5) + assert.Equal(5, len(numbers)) + }) +}