From d1a8f37a71275df7b7525c92ef63f9ba6e1984b3 Mon Sep 17 00:00:00 2001 From: feng6917 <82997695+feng6917@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:15:23 +0800 Subject: [PATCH 1/6] Correction of word assert spelling mistakes (#269) --- algorithm/lrucache_test.go | 16 ++++++++-------- algorithm/search_test.go | 18 +++++++++--------- algorithm/sort_test.go | 36 ++++++++++++++++++------------------ 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/algorithm/lrucache_test.go b/algorithm/lrucache_test.go index 0b1a582..6145445 100644 --- a/algorithm/lrucache_test.go +++ b/algorithm/lrucache_test.go @@ -8,7 +8,7 @@ import ( func TestLRUCache(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestLRUCache") + assert := internal.NewAssert(t, "TestLRUCache") cache := NewLRUCache[int, int](3) @@ -16,19 +16,19 @@ func TestLRUCache(t *testing.T) { cache.Put(2, 2) cache.Put(3, 3) - asssert.Equal(3, cache.Len()) + assert.Equal(3, cache.Len()) v, ok := cache.Get(1) - asssert.Equal(true, ok) - asssert.Equal(1, v) + assert.Equal(true, ok) + assert.Equal(1, v) v, ok = cache.Get(2) - asssert.Equal(true, ok) - asssert.Equal(2, v) + assert.Equal(true, ok) + assert.Equal(2, v) ok = cache.Delete(2) - asssert.Equal(true, ok) + assert.Equal(true, ok) _, ok = cache.Get(2) - asssert.Equal(false, ok) + assert.Equal(false, ok) } diff --git a/algorithm/search_test.go b/algorithm/search_test.go index d4586f4..b7665ef 100644 --- a/algorithm/search_test.go +++ b/algorithm/search_test.go @@ -8,34 +8,34 @@ import ( func TestLinearSearch(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestLinearSearch") + assert := internal.NewAssert(t, "TestLinearSearch") numbers := []int{3, 4, 5, 3, 2, 1} equalFunc := func(a, b int) bool { return a == b } - asssert.Equal(0, LinearSearch(numbers, 3, equalFunc)) - asssert.Equal(-1, LinearSearch(numbers, 6, equalFunc)) + assert.Equal(0, LinearSearch(numbers, 3, equalFunc)) + assert.Equal(-1, LinearSearch(numbers, 6, equalFunc)) } func TestBinarySearch(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestBinarySearch") + assert := internal.NewAssert(t, "TestBinarySearch") sortedNumbers := []int{1, 2, 3, 4, 5, 6, 7, 8} comparator := &intComparator{} - asssert.Equal(4, BinarySearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator)) - asssert.Equal(-1, BinarySearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator)) + assert.Equal(4, BinarySearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator)) + assert.Equal(-1, BinarySearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator)) } func TestBinaryIterativeSearch(t *testing.T) { - asssert := internal.NewAssert(t, "TestBinaryIterativeSearch") + assert := internal.NewAssert(t, "TestBinaryIterativeSearch") sortedNumbers := []int{1, 2, 3, 4, 5, 6, 7, 8} comparator := &intComparator{} - asssert.Equal(4, BinaryIterativeSearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator)) - asssert.Equal(-1, BinaryIterativeSearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator)) + assert.Equal(4, BinaryIterativeSearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator)) + assert.Equal(-1, BinaryIterativeSearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator)) } diff --git a/algorithm/sort_test.go b/algorithm/sort_test.go index d514aa3..e96a5e6 100644 --- a/algorithm/sort_test.go +++ b/algorithm/sort_test.go @@ -47,7 +47,7 @@ func (c *intComparator) Compare(v1 any, v2 any) int { func TestBubbleSortForStructSlice(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestBubbleSortForStructSlice") + assert := internal.NewAssert(t, "TestBubbleSortForStructSlice") peoples := []people{ {Name: "a", Age: 20}, @@ -62,23 +62,23 @@ func TestBubbleSortForStructSlice(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", peoples) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } func TestBubbleSortForIntSlice(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestBubbleSortForIntSlice") + assert := internal.NewAssert(t, "TestBubbleSortForIntSlice") numbers := []int{2, 1, 5, 3, 6, 4} comparator := &intComparator{} BubbleSort(numbers, comparator) - asssert.Equal([]int{1, 2, 3, 4, 5, 6}, numbers) + assert.Equal([]int{1, 2, 3, 4, 5, 6}, numbers) } func TestInsertionSort(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestInsertionSort") + assert := internal.NewAssert(t, "TestInsertionSort") peoples := []people{ {Name: "a", Age: 20}, @@ -93,12 +93,12 @@ func TestInsertionSort(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", peoples) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } func TestSelectionSort(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestSelectionSort") + assert := internal.NewAssert(t, "TestSelectionSort") peoples := []people{ {Name: "a", Age: 20}, @@ -113,12 +113,12 @@ func TestSelectionSort(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", peoples) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } func TestShellSort(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestShellSort") + assert := internal.NewAssert(t, "TestShellSort") peoples := []people{ {Name: "a", Age: 20}, @@ -133,12 +133,12 @@ func TestShellSort(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", peoples) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } func TestQuickSort(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestQuickSort") + assert := internal.NewAssert(t, "TestQuickSort") peoples := []people{ {Name: "a", Age: 20}, @@ -153,12 +153,12 @@ func TestQuickSort(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", peoples) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } func TestHeapSort(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestHeapSort") + assert := internal.NewAssert(t, "TestHeapSort") peoples := []people{ {Name: "a", Age: 20}, @@ -173,12 +173,12 @@ func TestHeapSort(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", peoples) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } func TestMergeSort(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestMergeSort") + assert := internal.NewAssert(t, "TestMergeSort") peoples := []people{ {Name: "a", Age: 20}, @@ -193,12 +193,12 @@ func TestMergeSort(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", peoples) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } func TestCountSort(t *testing.T) { t.Parallel() - asssert := internal.NewAssert(t, "TestCountSort") + assert := internal.NewAssert(t, "TestCountSort") peoples := []people{ {Name: "a", Age: 20}, @@ -213,5 +213,5 @@ func TestCountSort(t *testing.T) { expected := "[{d 8} {b 10} {c 17} {a 20} {e 28}]" actual := fmt.Sprintf("%v", sortedPeopleByAge) - asssert.Equal(expected, actual) + assert.Equal(expected, actual) } From ec161f335d631a0ac41ab5f3d89715a8929a1db4 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Thu, 14 Nov 2024 16:27:22 +0800 Subject: [PATCH 2/6] fix: update random seed when call random function --- random/random.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/random/random.go b/random/random.go index 1aa5db7..730ea9a 100644 --- a/random/random.go +++ b/random/random.go @@ -10,6 +10,7 @@ import ( "io" "math" "math/rand" + "os" "time" "unsafe" @@ -274,7 +275,9 @@ func nearestPowerOfTwo(cap int) int { // random generate a random string based on given string range. func random(s string, length int) string { // 确保随机数生成器的种子是动态的 - rand.Seed(time.Now().UnixNano()) + pid := os.Getpid() + timestamp := time.Now().UnixNano() + rand.Seed(int64(pid) + timestamp) // 仿照strings.Builder // 创建一个长度为 length 的字节切片 From 6b2c91b0f64ace46b671790758bc9bb80d2231a3 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Mon, 18 Nov 2024 16:25:32 +0800 Subject: [PATCH 3/6] feat: add Variance for math package --- docs/api/packages/mathutil.md | 33 ++++++++++++++++++++++++++++++ docs/en/api/packages/mathutil.md | 34 +++++++++++++++++++++++++++++++ mathutil/mathutil.go | 18 ++++++++++++++++ mathutil/mathutil_exmaple_test.go | 12 +++++++++++ mathutil/mathutil_test.go | 33 ++++++++++++++++++++++++++++++ 5 files changed, 130 insertions(+) diff --git a/docs/api/packages/mathutil.md b/docs/api/packages/mathutil.md index a75d73b..8ea258a 100644 --- a/docs/api/packages/mathutil.md +++ b/docs/api/packages/mathutil.md @@ -1162,4 +1162,37 @@ func main() { // 0.5 // 0 } +``` + +### Variance + +

计算方差

+ +函数签名: + +```go +func Variance[T constraints.Float | constraints.Integer](numbers []T) float64 +``` + +示例:[示例](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.Variance([]int{1, 2, 3, 4, 5}) + result2 := mathutil.Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5}) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 2 + // 2.42 +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/mathutil.md b/docs/en/api/packages/mathutil.md index 3f4387f..0133c79 100644 --- a/docs/en/api/packages/mathutil.md +++ b/docs/en/api/packages/mathutil.md @@ -52,6 +52,7 @@ import ( - [Sum](#Sum) - [Abs](#Abs) - [Div](#Div) +- [Variance](#Variance)
@@ -1161,4 +1162,37 @@ func main() { // 0.5 // 0 } +``` + +### Variance + +

Returns the variance of numbers.

+ +Signature: + +```go +func Variance[T constraints.Float | constraints.Integer](numbers []T) float64 +``` + +Example:[Run](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.Variance([]int{1, 2, 3, 4, 5}) + result2 := mathutil.Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5}) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 2 + // 2.42 +} ``` \ No newline at end of file diff --git a/mathutil/mathutil.go b/mathutil/mathutil.go index dc6b1b1..742f466 100644 --- a/mathutil/mathutil.go +++ b/mathutil/mathutil.go @@ -395,3 +395,21 @@ func Abs[T constraints.Integer | constraints.Float](x T) T { func Div[T constraints.Float | constraints.Integer](x T, y T) float64 { return float64(x) / float64(y) } + +// Variance returns the variance of numbers. +// Play: todo +func Variance[T constraints.Float | constraints.Integer](numbers []T) float64 { + n := len(numbers) + if n == 0 { + return 0 + } + + avg := Average(numbers...) + var sum T + + for _, v := range numbers { + sum += (v - avg) * (v - avg) + } + + return float64(sum) / float64(n) +} diff --git a/mathutil/mathutil_exmaple_test.go b/mathutil/mathutil_exmaple_test.go index 4f77be4..dd792f5 100644 --- a/mathutil/mathutil_exmaple_test.go +++ b/mathutil/mathutil_exmaple_test.go @@ -478,3 +478,15 @@ func ExampleDiv() { // 0.5 // 0 } + +func ExampleVariance() { + result1 := Variance([]int{1, 2, 3, 4, 5}) + result2 := Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5}) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 2 + // 2.42 +} diff --git a/mathutil/mathutil_test.go b/mathutil/mathutil_test.go index 3051a41..36adf82 100644 --- a/mathutil/mathutil_test.go +++ b/mathutil/mathutil_test.go @@ -413,3 +413,36 @@ func TestDiv(t *testing.T) { assert.Equal(math.Inf(-1), Div(-8, 0)) assert.Equal(true, math.IsNaN(Div(0, 0))) } + +func TestVariance(t *testing.T) { + t.Parallel() + + assert := internal.NewAssert(t, "TestVariance") + + testIntNumbers := []struct { + numbers []int + expected float64 + }{ + {[]int{0}, 0}, + {[]int{1, 1, 1}, 0}, + {[]int{1, 2, 3, 4}, 1.5}, + {[]int{1, 2, 3, 4, 5}, 2.0}, + } + + for _, tt := range testIntNumbers { + assert.Equal(tt.expected, TruncRound(Variance(tt.numbers), 2)) + } + + testFloatNumbers := []struct { + numbers []float64 + expected float64 + }{ + {[]float64{0}, 0}, + {[]float64{1, 1, 1}, 0}, + {[]float64{1.1, 2.2, 3.3, 4.4}, 1.51}, + } + + for _, tt := range testFloatNumbers { + assert.Equal(tt.expected, TruncRound(Variance(tt.numbers), 2)) + } +} From 8322951475f7e648f4c26a54adaa7b4dd7236515 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Mon, 18 Nov 2024 17:01:27 +0800 Subject: [PATCH 4/6] feat: add StdDev and fix bug of Average for math package --- cryptor/rsa_private_example.pem | 98 +++++++++++++++---------------- cryptor/rsa_public_example.pem | 24 ++++---- docs/api/packages/mathutil.md | 41 ++++++++++++- docs/en/api/packages/mathutil.md | 50 +++++++++++++--- mathutil/mathutil.go | 24 ++++---- mathutil/mathutil_exmaple_test.go | 14 ++++- mathutil/mathutil_test.go | 55 +++++++++++++++-- 7 files changed, 218 insertions(+), 88 deletions(-) diff --git a/cryptor/rsa_private_example.pem b/cryptor/rsa_private_example.pem index 91b1a19..cfc0457 100644 --- a/cryptor/rsa_private_example.pem +++ b/cryptor/rsa_private_example.pem @@ -1,51 +1,51 @@ -----BEGIN rsa private key----- -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 -----END rsa private key----- diff --git a/cryptor/rsa_public_example.pem b/cryptor/rsa_public_example.pem index 1c524d3..79deb44 100644 --- a/cryptor/rsa_public_example.pem +++ b/cryptor/rsa_public_example.pem @@ -1,14 +1,14 @@ -----BEGIN rsa public key----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3bRSY5GD7uJB3jvwqa9Z -ZFpN3uLIGbbPA+yiyf6tJZp3K3rmkVFfEcWqtK1EfHvd9G4rqLYJ9ZcohDZgD/Ww -mqJtaaWh2/7feMPaitp50bYVilpPhaxULx+MIjQn3XXowYvr4fX7N052t4IC95tA -anPEEwZRQJOVMtibAxwI/ofUOCpTPtuK3AoErDxS18JPgjQ34yY4Jsch0de53+Sj -Tk+bJpLUlnY4brm+A23FhwTlE5njrKA+Texrg52KJ8aPhLuVQBcZP1SJsxv2PZru -uD+0xfLDRrZ7BOTpun+1FBhdlxBefIfBQbBBfy7STw+ignTaO+IRIHhcqKZ+12Na -+4GAusmpSiB3LATy82h0nB0PX3hSOLYmFI61px4l/yM50E4brF1NFtd/BpoozZaj -gxjJaznuZXFQ1YSG0JjCeszqdzU+6dexGTr+4Lr87NfLekmUX1nZYy/E5lST65lG -lI4hX1nR5+nVN9ALRYByNz6oJd0IfF4dhoNlGPc1VksskeY8rPZwXITbSifAN7zv -EiwKreFV3t0BLKsvWRu9GdpWy+d2AmelXkNm+QaH2mPM17euMoNZVyzizrZaJkh/ -aHO/UgY1/y7sXFl4akC9hk9ILONCUn6FVI4BXMXb5kZgwDk5tWE5A159LtC579yG -cnxyc9Y9NNFOGrqFqPiu6QUCAwEAAQ== +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAymvyNgI0T1P/DnFA2Fom +Mrx4SzBf9p4VJ70AyYmbdeGhtzh+u6zNoDQ2UMmDzcCbtv9JW7PX80O8xy/O006g +eNPfW74T5ryH2GEj3Y+eOtIzYI6gQy74JXqiqEztE6BkvesYHC+Yo8IIrawBBYHg +GvluAudTZPqnkcqnUd8ngfhahCQrMi+sKqiqOWC/D0FVSclfugWw5/EBxJJSBSPY +umLJelbk3PqXtVm46mvGnlQlfHGppYQ5Nj6zKilCgoJoAHURp4dAaOwAhVOtc31M +0WPre/9th4TodZu1GeqFt5HqmMeP5+p2GDNDSxDNP3lgCgSqwRzy4pYaE5e70azn +Os5iaclAAlrLN3aSK6lDT+BGQbQrQgM47x3flMfszqNeuaBwdiNyzEodhT8eiYl8 +m08B1sVI811q7pG8WUVZjIYs2BzVjK/VDnvbEyayX+RGCAXr5M/bfDM1YRfVS9TW +xspQNB3pyxgLX//LJIATbutUVKcrjxjoS7GdEocSruTOm/J+ZMTm0EqhsbRHVm+7 +GcsSLaiSACEq+ONQJsN1x1o2GGVEi3pEZnDITSsokdcyrBj1A9a5Hx4tSiMbg88g +S4MPOALzBTmEVneQC+U5HTG/erUpZk6/AhT9Flk3HQTNIdzz8a2Clfeh4GU1JoKB +4u++XPt4M5h75OWnd5r9HYUCAwEAAQ== -----END rsa public key----- diff --git a/docs/api/packages/mathutil.md b/docs/api/packages/mathutil.md index 8ea258a..0f07daa 100644 --- a/docs/api/packages/mathutil.md +++ b/docs/api/packages/mathutil.md @@ -52,6 +52,8 @@ import ( - [Sum](#Sum) - [Abs](#Abs) - [Div](#Div) +- [Variance](#Variance) +- [StdDev](#StdDev)
@@ -64,7 +66,7 @@ import ( 函数签名: ```go -func Average[T constraints.Integer | constraints.Float](numbers ...T) T +func Average[T constraints.Integer | constraints.Float](numbers ...T) float64 ``` 示例:[运行](https://go.dev/play/p/HFd70x4DrMj) @@ -87,7 +89,7 @@ func main() { fmt.Println(result2) // Output: - // 1 + // 1.5 // 1.3 } ``` @@ -1166,7 +1168,7 @@ func main() { ### Variance -

计算方差

+

计算方差。

函数签名: @@ -1195,4 +1197,37 @@ func main() { // 2 // 2.42 } +``` + +### StdDev + +

计算标准差。

+ +函数签名: + +```go +func StdDev[T constraints.Float | constraints.Integer](numbers []T) float64 +``` + +示例:[Run](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.TruncRound(mathutil.StdDev([]int{1, 2, 3, 4, 5}), 2) + result2 := mathutil.TruncRound(mathutil.StdDev([]float64{1.1, 2.2, 3.3, 4.4, 5.5}), 2) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 1.41 + // 1.55 +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/mathutil.md b/docs/en/api/packages/mathutil.md index 0133c79..6d1ac0f 100644 --- a/docs/en/api/packages/mathutil.md +++ b/docs/en/api/packages/mathutil.md @@ -53,6 +53,7 @@ import ( - [Abs](#Abs) - [Div](#Div) - [Variance](#Variance) +- [StdDev](#StdDev)
@@ -65,7 +66,7 @@ import ( Signature: ```go -func Average[T constraints.Integer | constraints.Float](numbers ...T) T +func Average[T constraints.Integer | constraints.Float](numbers ...T) float64 ``` Example:[Run](https://go.dev/play/p/Vv7LBwER-pz) @@ -88,7 +89,7 @@ func main() { fmt.Println(result2) // Output: - // 1 + // 1.5 // 1.3 } ``` @@ -1186,13 +1187,46 @@ import ( func main() { result1 := mathutil.Variance([]int{1, 2, 3, 4, 5}) - result2 := mathutil.Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5}) + result2 := mathutil.Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5}) - fmt.Println(result1) - fmt.Println(result2) + fmt.Println(result1) + fmt.Println(result2) - // Output: - // 2 - // 2.42 + // Output: + // 2 + // 2.42 +} +``` + +### StdDev + +

Returns the standard deviation of numbers.

+ +Signature: + +```go +func StdDev[T constraints.Float | constraints.Integer](numbers []T) float64 +``` + +Example:[Run](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.TruncRound(mathutil.StdDev([]int{1, 2, 3, 4, 5}), 2) + result2 := mathutil.TruncRound(mathutil.StdDev([]float64{1.1, 2.2, 3.3, 4.4, 5.5}), 2) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 1.41 + // 1.55 } ``` \ No newline at end of file diff --git a/mathutil/mathutil.go b/mathutil/mathutil.go index 742f466..0f4c2d7 100644 --- a/mathutil/mathutil.go +++ b/mathutil/mathutil.go @@ -224,14 +224,12 @@ func Sum[T constraints.Integer | constraints.Float](numbers ...T) T { // Average return average value of numbers. // Play: https://go.dev/play/p/Vv7LBwER-pz -func Average[T constraints.Integer | constraints.Float](numbers ...T) T { - var sum T - n := T(len(numbers)) - - for _, v := range numbers { - sum += v +func Average[T constraints.Integer | constraints.Float](numbers ...T) float64 { + var sum float64 + for _, num := range numbers { + sum += float64(num) } - return sum / n + return sum / float64(len(numbers)) } // Range creates a slice of numbers from start with specified count, element step is 1. @@ -405,11 +403,17 @@ func Variance[T constraints.Float | constraints.Integer](numbers []T) float64 { } avg := Average(numbers...) - var sum T + var sum float64 for _, v := range numbers { - sum += (v - avg) * (v - avg) + sum += (float64(v) - avg) * (float64(v) - avg) } - return float64(sum) / float64(n) + return sum / float64(n) +} + +// StdDev returns the standard deviation of numbers. +// Play: todo +func StdDev[T constraints.Float | constraints.Integer](numbers []T) float64 { + return math.Sqrt(Variance(numbers)) } diff --git a/mathutil/mathutil_exmaple_test.go b/mathutil/mathutil_exmaple_test.go index dd792f5..1408aab 100644 --- a/mathutil/mathutil_exmaple_test.go +++ b/mathutil/mathutil_exmaple_test.go @@ -178,7 +178,7 @@ func ExampleAverage() { fmt.Println(result2) // Output: - // 1 + // 1.5 // 1.3 } @@ -490,3 +490,15 @@ func ExampleVariance() { // 2 // 2.42 } + +func ExampleStdDev() { + result1 := TruncRound(StdDev([]int{1, 2, 3, 4, 5}), 2) + result2 := TruncRound(StdDev([]float64{1.1, 2.2, 3.3, 4.4, 5.5}), 2) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 1.41 + // 1.55 +} diff --git a/mathutil/mathutil_test.go b/mathutil/mathutil_test.go index 36adf82..b79fb24 100644 --- a/mathutil/mathutil_test.go +++ b/mathutil/mathutil_test.go @@ -143,11 +143,22 @@ func TestAverage(t *testing.T) { assert := internal.NewAssert(t, "TestAverage") - assert.Equal(0, Average(0, 0)) - assert.Equal(1, Average(1, 1)) + tests := []struct { + numbers []int + expected float64 + }{ + {[]int{0}, 0}, + {[]int{1, 1, 1}, 1}, + {[]int{1, 2, 3, 4}, 2.5}, + {[]int{1, 2, 3, 4, 5}, 3}, + } - avg := Average(1.2, 1.4) - assert.Equal(1.3, RoundToFloat(avg, 1)) + for _, tt := range tests { + assert.Equal(tt.expected, Average(tt.numbers...)) + } + + avg := Average(1.1, 1.2, 1.3, 1.4) + assert.Equal(1.25, avg) } func TestSum(t *testing.T) { @@ -425,7 +436,7 @@ func TestVariance(t *testing.T) { }{ {[]int{0}, 0}, {[]int{1, 1, 1}, 0}, - {[]int{1, 2, 3, 4}, 1.5}, + {[]int{1, 2, 3, 4}, 1.25}, {[]int{1, 2, 3, 4, 5}, 2.0}, } @@ -446,3 +457,37 @@ func TestVariance(t *testing.T) { assert.Equal(tt.expected, TruncRound(Variance(tt.numbers), 2)) } } + +func TestStdDev(t *testing.T) { + + t.Parallel() + + assert := internal.NewAssert(t, "TestStdDev") + + testIntNumbers := []struct { + numbers []int + expected float64 + }{ + {[]int{0}, 0}, + {[]int{1, 1, 1}, 0}, + {[]int{1, 2, 3, 4}, 1.118}, + {[]int{1, 2, 3, 4, 5}, 1.414}, + } + + for _, tt := range testIntNumbers { + assert.Equal(tt.expected, TruncRound(StdDev(tt.numbers), 3)) + } + + testFloatNumbers := []struct { + numbers []float64 + expected float64 + }{ + {[]float64{0}, 0}, + {[]float64{1, 1, 1}, 0}, + {[]float64{1.1, 2.2, 3.3, 4.4}, 1.229}, + } + + for _, tt := range testFloatNumbers { + assert.Equal(tt.expected, TruncRound(StdDev(tt.numbers), 3)) + } +} From 95a894e53f9b7ae62aa439a413e552ed4684877a Mon Sep 17 00:00:00 2001 From: dudaodong Date: Tue, 19 Nov 2024 10:12:07 +0800 Subject: [PATCH 5/6] feat: add Permutation and Combination --- mathutil/mathutil.go | 44 +++++++++++++++++++++++++---- mathutil/mathutil_exmaple_test.go | 24 ++++++++++++++++ mathutil/mathutil_test.go | 46 +++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 6 deletions(-) diff --git a/mathutil/mathutil.go b/mathutil/mathutil.go index 0f4c2d7..148d3f3 100644 --- a/mathutil/mathutil.go +++ b/mathutil/mathutil.go @@ -44,14 +44,19 @@ func Fibonacci(first, second, n int) int { } } -// Factorial calculate x!. +// Factorial calculate n!. // Play: https://go.dev/play/p/tt6LdOK67Nx -func Factorial(x uint) uint { - var f uint = 1 - for ; x > 1; x-- { - f *= x +func Factorial(n uint) uint { + if n == 0 || n == 1 { + return 1 } - return f + + result := uint(1) + for i := uint(2); i <= n; i++ { + result *= i + } + + return result } // Percent calculate the percentage of value to total. @@ -417,3 +422,30 @@ func Variance[T constraints.Float | constraints.Integer](numbers []T) float64 { func StdDev[T constraints.Float | constraints.Integer](numbers []T) float64 { return math.Sqrt(Variance(numbers)) } + +// Permutation calculate P(n, k). +// Play: todo +func Permutation(n, k uint) uint { + if n < k { + return 0 + } + + nFactorial := Factorial(n) + nMinusKFactorial := Factorial(n - k) + + return nFactorial / nMinusKFactorial +} + +// Combination calculate C(n, k). +// Play: todo +func Combination(n, k uint) uint { + if n < k { + return 0 + } + + nFactorial := Factorial(n) + kFactorial := Factorial(k) + nMinusKFactorial := Factorial(n - k) + + return nFactorial / (kFactorial * nMinusKFactorial) +} diff --git a/mathutil/mathutil_exmaple_test.go b/mathutil/mathutil_exmaple_test.go index 1408aab..ed840ac 100644 --- a/mathutil/mathutil_exmaple_test.go +++ b/mathutil/mathutil_exmaple_test.go @@ -502,3 +502,27 @@ func ExampleStdDev() { // 1.41 // 1.55 } + +func ExamplePermutation() { + result1 := Permutation(5, 3) + result2 := Permutation(5, 5) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 60 + // 120 +} + +func ExampleCombination() { + result1 := Combination(5, 3) + result2 := Combination(5, 5) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 10 + // 1 +} diff --git a/mathutil/mathutil_test.go b/mathutil/mathutil_test.go index b79fb24..0252490 100644 --- a/mathutil/mathutil_test.go +++ b/mathutil/mathutil_test.go @@ -491,3 +491,49 @@ func TestStdDev(t *testing.T) { assert.Equal(tt.expected, TruncRound(StdDev(tt.numbers), 3)) } } + +func TestPermutation(t *testing.T) { + t.Parallel() + + assert := internal.NewAssert(t, "TestPermutation") + + tests := []struct { + n uint + k uint + expected uint + }{ + {1, 1, 1}, + {1, 0, 1}, + {0, 1, 0}, + {0, 0, 1}, + {3, 2, 6}, + {4, 2, 12}, + } + + for _, tt := range tests { + assert.Equal(tt.expected, Permutation(tt.n, tt.k)) + } +} + +func TestCombination(t *testing.T) { + t.Parallel() + + assert := internal.NewAssert(t, "TestCombination") + + tests := []struct { + n uint + k uint + expected uint + }{ + {1, 1, 1}, + {1, 0, 1}, + {0, 1, 0}, + {0, 0, 1}, + {3, 2, 3}, + {4, 2, 6}, + } + + for _, tt := range tests { + assert.Equal(tt.expected, Combination(tt.n, tt.k)) + } +} From 3be706e23f292e0fef1abe39b41304cbc69771ce Mon Sep 17 00:00:00 2001 From: dudaodong Date: Tue, 19 Nov 2024 10:25:32 +0800 Subject: [PATCH 6/6] doc: add doc for Permutation and Combination function --- docs/api/packages/mathutil.md | 90 ++++++++++++++++++++++++++++---- docs/en/api/packages/mathutil.md | 68 ++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 11 deletions(-) diff --git a/docs/api/packages/mathutil.md b/docs/api/packages/mathutil.md index 0f07daa..ff9389b 100644 --- a/docs/api/packages/mathutil.md +++ b/docs/api/packages/mathutil.md @@ -33,7 +33,7 @@ import ( - [Percent](#Percent) - [RoundToFloat](#RoundToFloat) - [RoundToString](#RoundToString) -- [TruncRound](#TruncRound) +- [T运行cRound](#T运行cRound) - [CeilToFloat](#CeilToFloat) - [CeilToString](#CeilToString) - [FloorToFloat](#FloorToFloat) @@ -54,6 +54,8 @@ import ( - [Div](#Div) - [Variance](#Variance) - [StdDev](#StdDev) +- [Permutation](#Permutation) +- [Combination](#Combination)
@@ -464,14 +466,14 @@ func main() { } ``` -### TruncRound +### T运行cRound

截短n位小数(不进行四舍五入)

函数签名: ```go -func TruncRound[T constraints.Float | constraints.Integer](x T, n int) T +func T运行cRound[T constraints.Float | constraints.Integer](x T, n int) T ``` 示例:[运行](https://go.dev/play/p/aumarSHIGzP) @@ -485,9 +487,9 @@ import ( ) func main() { - result1 := mathutil.TruncRound(0.124, 2) - result2 := mathutil.TruncRound(0.125, 2) - result3 := mathutil.TruncRound(0.125, 3) + result1 := mathutil.T运行cRound(0.124, 2) + result2 := mathutil.T运行cRound(0.125, 2) + result3 := mathutil.T运行cRound(0.125, 3) fmt.Println(result1) fmt.Println(result2) @@ -1047,8 +1049,8 @@ import ( func main() { result1 := mathutil.Log(8, 2) - result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2) - result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0) + result2 := mathutil.T运行cRound(mathutil.Log(5, 2), 2) + result3 := mathutil.T运行cRound(mathutil.Log(27, 3), 0) fmt.Println(result1) fmt.Println(result2) @@ -1209,7 +1211,7 @@ func main() { func StdDev[T constraints.Float | constraints.Integer](numbers []T) float64 ``` -示例:[Run](todo) +示例:[运行](todo) ```go package main @@ -1220,8 +1222,8 @@ import ( ) func main() { - result1 := mathutil.TruncRound(mathutil.StdDev([]int{1, 2, 3, 4, 5}), 2) - result2 := mathutil.TruncRound(mathutil.StdDev([]float64{1.1, 2.2, 3.3, 4.4, 5.5}), 2) + result1 := mathutil.T运行cRound(mathutil.StdDev([]int{1, 2, 3, 4, 5}), 2) + result2 := mathutil.T运行cRound(mathutil.StdDev([]float64{1.1, 2.2, 3.3, 4.4, 5.5}), 2) fmt.Println(result1) fmt.Println(result2) @@ -1230,4 +1232,70 @@ func main() { // 1.41 // 1.55 } +``` + +### Permutation + +

计算排列数(P(n, k))。

+ +函数签名: + +```go +func Permutation(n, k uint) uint +``` + +示例:[运行](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.Permutation(5, 3) + result2 := mathutil.Permutation(5, 5) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 60 + // 120 +} +``` + +### Combination + +

计算组合数(C(n, k))。

+ +函数签名: + +```go +func Combination(n, k uint) uint +``` + +示例:[运行](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.Combination(5, 3) + result2 := mathutil.Combination(5, 5) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 10 + // 1 +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/mathutil.md b/docs/en/api/packages/mathutil.md index 6d1ac0f..38486c4 100644 --- a/docs/en/api/packages/mathutil.md +++ b/docs/en/api/packages/mathutil.md @@ -54,6 +54,8 @@ import ( - [Div](#Div) - [Variance](#Variance) - [StdDev](#StdDev) +- [Permutation](#Permutation) +- [Combination](#Combination)
@@ -1229,4 +1231,70 @@ func main() { // 1.41 // 1.55 } +``` + +### Permutation + +

Calculates P(n, k).

+ +Signature: + +```go +func Permutation(n, k uint) uint +``` + +Example:[Run](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.Permutation(5, 3) + result2 := mathutil.Permutation(5, 5) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 60 + // 120 +} +``` + +### Combination + +

Calculates C(n, k).

+ +Signature: + +```go +func Combination(n, k uint) uint +``` + +Example:[Run](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.Combination(5, 3) + result2 := mathutil.Combination(5, 5) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 10 + // 1 +} ``` \ No newline at end of file