-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrandom.go
163 lines (145 loc) · 2.72 KB
/
random.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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**********************************************************
* Author :
* Email :
* Last modified : 2016-09-15 17:29:51
* Filename : random.go
* Description : 常用的随机数工具方法
* *******************************************************/
package utils
import (
r "crypto/rand"
"math/rand"
)
func o() *rand.Rand {
return rand.New(rand.NewSource(TimestampNano()))
}
/**
* 获取int类型随机数
* @return r int
*/
func RandInt() (r int) {
return (o().Int())
}
/**
* 获取[0,n)int类型随机数
* @param n int
* @return r int
*/
func RandIntN(n int) (r int) {
return (o().Intn(n))
}
/**
* 获取int32类型随机数
* @return r int32
*/
func RandInt32() (r int32) {
return (o().Int31())
}
/**
* 获取uint32类型随机数
* @return r uint32
*/
func RandUint32() (r uint32) {
return (o().Uint32())
}
/**
* 获取int32类型随机数
* @param n int32
* @return r int32
*/
func RandInt32N(n int32) (r int32) {
return (o().Int31n(n))
}
/**
* 获取int64类型随机数
* @return r int64
*/
func RandInt64() (r int64) {
return (o().Int63())
}
/**
* 获取int64类型随机数
* @param n int64
* @return r int64
*/
func RandInt64N(n int64) (r int64) {
return (o().Int63n(n))
}
/**
* 获取float32类型随机数
* @return r float32
*/
func RandFloat32() (r float32) {
return (o().Float32())
}
/**
* 获取float64类型随机数
* @return r float64
*/
func RandFloat64() (r float64) {
return (o().Float64())
}
/**
* Chan中存放随机数
*/
var RandInt32Chan chan int32
var RandUint32Chan chan uint32
func Init() {
RandInt32Chan = make(chan int32, 10)
RandUint32Chan = make(chan uint32, 10)
go func() {
for {
select {
case RandInt32Chan <- RandInt32():
case RandUint32Chan <- RandUint32():
}
}
}()
}
/**
* 从RandInt32Chan中获取int32类型随机数
* @return int32
*/
func GetRandInt32() int32 {
return <-RandInt32Chan
}
/**
* 从RandUint32Chan中获取uint32类型随机数
* @return uint32
*/
func GetRandUint32() uint32 {
return <-RandUint32Chan
}
/**
* Rand Send
* @return
*/
func Seed() {
rand.Seed(TimestampNano())
}
var alphaNum = []byte(`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`)
/**
* RandomCreateBytes generate random []byte by specify chars.
* @param n int
* @param alphabets []byte
* @return []byte
*/
func RandomCreateBytes(n int, alphabets ...byte) []byte {
if len(alphabets) == 0 {
alphabets = alphaNum
}
var bytes = make([]byte, n)
var randBy bool
if num, err := r.Read(bytes); num != n || err != nil {
Seed()
randBy = true
}
for i, b := range bytes {
if randBy {
bytes[i] = alphabets[rand.Intn(len(alphabets))]
} else {
bytes[i] = alphabets[b%byte(len(alphabets))]
}
}
return bytes
}