-
Notifications
You must be signed in to change notification settings - Fork 0
/
math.go
139 lines (123 loc) · 2.21 KB
/
math.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package web
import (
"crypto/md5"
crand "crypto/rand"
"crypto/sha1"
"encoding/hex"
"io"
"math"
"math/rand"
"strconv"
)
func RandDigitCode(l int) string {
var out string
for i := 0; i < l; i++ {
a := rand.Intn(10)
out += strconv.Itoa(a)
}
return out
}
func GenerateNonce(size int) []byte {
b := make([]byte, size)
_, _ = crand.Read(b)
return b
}
// 生成的字符串长度是size的2倍
func GenerateStringNonce(size int) string {
b := make([]byte, size)
_, _ = crand.Read(b)
return hex.EncodeToString(b)
}
func AbsInt64(d int64) int64 {
if d < 0 {
return -d
}
return d
}
func Sha1Digest(data []byte) []byte {
r := sha1.Sum(data)
return r[:]
}
func Sha1String(data []byte) string {
r := sha1.Sum(data)
return hex.EncodeToString(r[:])
}
func Md5String(data []byte) string {
r := md5.Sum(data)
return hex.EncodeToString(r[:])
}
func FileMd5String(f io.Reader) string {
h := md5.New()
_, err := io.Copy(h, f)
Raise(err)
return hex.EncodeToString(h.Sum(nil))
}
func ShuffleInt64(a []int64) {
for i := 0; i < len(a); i++ {
j := rand.Int63n(int64(len(a)))
a[i], a[j] = a[j], a[i]
}
}
// 随机采样n条数据
func SampleInt64(src []int64, n int) []int64 {
var out []int64
if n <= 0 {
return out
}
sz := len(src)
if sz == 0 {
return out
}
if n > sz {
n = sz
}
m := rand.Perm(sz)
for _, i := range m[:n] {
out = append(out, src[i])
}
return out
}
// 随机选取一条
func ChoiceInt64(src []int64) int64 {
if len(src) == 0 {
return 0
}
i := rand.Intn(len(src))
return src[i]
}
func ChoiceInts(src []int) int {
if len(src) == 0 {
return 0
}
i := rand.Intn(len(src))
return src[i]
}
// 集合: 求差集 A-B
func SubtractInt64s(a, b []int64) []int64 {
var out []int64
if len(a) == 0 {
return out
}
if len(b) == 0 {
copy(out, a)
return out
}
bm := make(map[int64]struct{}, len(a))
for _, v := range b {
bm[v] = struct{}{}
}
for _, v := range a {
if _, ok := bm[v]; !ok {
out = append(out, v)
}
}
return out
}
// 保留两位小数(keep 2 decimal places)
func Double2dp(n float64) float64 {
return math.Trunc(n*1e2+0.5) * 1e-2
}
// 保留两位小数(keep 2 decimal places)
func Float2dp(n float32) float32 {
return float32(Double2dp(float64(n)))
}