├── .gitignore ├── README.md ├── example └── main.go ├── phone.go ├── rand.go ├── rand_car_plate.go ├── rand_ip.go ├── rand_name.go ├── rand_string.go ├── rand_test.go ├── slice.go └── slice_test.go /.gitignore: -------------------------------------------------------------------------------- 1 | example/example 2 | example/example.exe -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ````go 3 | package main 4 | 5 | import ( 6 | "fmt" 7 | 8 | "github.com/goroom/rand" 9 | ) 10 | 11 | func main() { 12 | fmt.Println(rand.Int(), rand.Intn(10)) 13 | fmt.Println(rand.Int32(), rand.Int32n(10)) 14 | fmt.Println(rand.Int64(), rand.Int64n(10)) 15 | fmt.Println(rand.Float32(), rand.Float64()) 16 | fmt.Println(rand.Perm(10)) 17 | fmt.Println(rand.RandRange(1, 3), 18 | rand.RandRangeInt32(1291212412, 2091212412), 19 | rand.RandRangeInt64(129121241212912124, 229121241212912124)) 20 | fmt.Println(rand.Bool()) 21 | 22 | fmt.Println(rand.String(32, rand.RST_LOWER)) 23 | fmt.Println(rand.String(32, rand.RST_UPPER)) 24 | fmt.Println(rand.String(32, rand.RST_NUMBER)) 25 | fmt.Println(rand.String(32, rand.RST_SYMBOL)) 26 | fmt.Println(rand.String(32, 0)) 27 | 28 | fmt.Println(rand.StringArray(&[]string{"张三", "李四", "王五", "赵六"})) 29 | fmt.Println(rand.CarPlate()) 30 | fmt.Println(rand.ChineseName()) 31 | 32 | fmt.Println(rand.RandPhone()) 33 | } 34 | ```` 35 | 36 | 结果 37 | ````go 38 | 4156960477472916945 8 39 | 1591767834 8 40 | 1849074015167768215 6 41 | 0.3724794 0.24850495941917342 42 | [9 3 1 0 5 4 6 7 8 2] 43 | 3 2058348008 173108310343143870 44 | false 45 | embvdawhehdptibctdarfwfrolunwecf 46 | NRSLUFQAEHYUOZMYKHNSEGEWSRIEYMOZ 47 | 09052341237931033459193029727749 48 | \+&/(@`~!,+],>(+!<,#+$_==}^%'+>\ 49 | r3GFZ@0FxTsN9#Il]Q0z6mJj_,i=dHVZ 50 | 李四 51 | 浙H3CVXL 52 | 花力启 53 | 15303145889 54 | ```` 55 | -------------------------------------------------------------------------------- /example/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | 6 | rd "github.com/goroom/rand" 7 | ) 8 | 9 | func main() { 10 | rand := rd.GetRand() 11 | fmt.Println(rand.Int(), rand.Intn(10)) 12 | fmt.Println(rand.Int31(), rand.Int31n(10)) 13 | fmt.Println(rand.Int63(), rand.Int63n(10)) 14 | fmt.Println(rand.Float32(), rand.Float64()) 15 | fmt.Println(rand.Perm(10)) 16 | fmt.Println(rand.RandRange(1, 3), 17 | rand.RandRangeInt32(1291212412, 2091212412), 18 | rand.RandRangeInt64(129121241212912124, 229121241212912124)) 19 | fmt.Println(rand.Bool()) 20 | 21 | fmt.Println(rand.String(32, rd.RST_LOWER)) 22 | fmt.Println(rand.String(32, rd.RST_UPPER)) 23 | fmt.Println(rand.String(32, rd.RST_NUMBER)) 24 | fmt.Println(rand.String(32, rd.RST_SYMBOL)) 25 | fmt.Println(rand.String(32, 0)) 26 | 27 | fmt.Println(rand.StringArray(&[]string{"张三", "李四", "王五", "赵六"})) 28 | fmt.Println(rand.CarPlate()) 29 | fmt.Println(rand.ChineseName()) 30 | 31 | fmt.Println(rand.Phone()) 32 | } 33 | -------------------------------------------------------------------------------- /phone.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | var ( 4 | gPhonePrefixList []string = []string{"130", "131", "132", "133", "134", "135", "136", "137", "138", 5 | "139", "147", "150", "151", "152", "153", "155", "156", "157", "158", "159", "186", 6 | "187", "188"} 7 | ) 8 | 9 | func (r *Rand) Phone() string { 10 | return r.StringArray(&gPhonePrefixList) + r.String(8, RST_NUMBER) 11 | } 12 | -------------------------------------------------------------------------------- /rand.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | import ( 4 | "math/rand" 5 | "sync" 6 | "time" 7 | ) 8 | 9 | type Rand struct { 10 | sync.Mutex 11 | rand *rand.Rand 12 | } 13 | 14 | var ( 15 | gRand *Rand 16 | ) 17 | 18 | func init() { 19 | gRand = &Rand{ 20 | rand: rand.New(rand.NewSource(time.Now().UnixNano())), 21 | } 22 | } 23 | 24 | func (r *Rand) ExpFloat64() float64 { r.Lock(); defer r.Unlock(); return r.rand.ExpFloat64() } 25 | func (r *Rand) Float32() float32 { r.Lock(); defer r.Unlock(); return r.rand.Float32() } 26 | func (r *Rand) Float64() float64 { r.Lock(); defer r.Unlock(); return r.rand.Float64() } 27 | func (r *Rand) Int() int { r.Lock(); defer r.Unlock(); return r.rand.Int() } 28 | func (r *Rand) Int31() int32 { r.Lock(); defer r.Unlock(); return r.rand.Int31() } 29 | func (r *Rand) Int31n(n int32) int32 { r.Lock(); defer r.Unlock(); return r.rand.Int31n(n) } 30 | func (r *Rand) Int63() int64 { r.Lock(); defer r.Unlock(); return r.rand.Int63() } 31 | func (r *Rand) Int63n(n int64) int64 { r.Lock(); defer r.Unlock(); return r.rand.Int63n(n) } 32 | func (r *Rand) Intn(n int) int { r.Lock(); defer r.Unlock(); return r.rand.Intn(n) } 33 | func (r *Rand) NormFloat64() float64 { r.Lock(); defer r.Unlock(); return r.rand.NormFloat64() } 34 | func (r *Rand) Perm(n int) []int { r.Lock(); defer r.Unlock(); return r.rand.Perm(n) } 35 | func (r *Rand) Read(p []byte) (int, error) { r.Lock(); defer r.Unlock(); return r.rand.Read(p) } 36 | func (r *Rand) Seed(seed int64) { r.Lock(); defer r.Unlock(); r.rand.Seed(seed) } 37 | func (r *Rand) Uint32() uint32 { r.Lock(); defer r.Unlock(); return r.rand.Uint32() } 38 | func (r *Rand) Uint64() uint64 { r.Lock(); defer r.Unlock(); return r.rand.Uint64() } 39 | 40 | func GetRand() *Rand { 41 | return gRand 42 | } 43 | 44 | //func ExpFloat64() float64 { return gRand.ExpFloat64() } 45 | //func Float32() float32 { return gRand.Float32() } 46 | //func Float64() float64 { return gRand.Float64() } 47 | //func Int() int { return gRand.Int() } 48 | //func Int31() int32 { return gRand.Int31() } 49 | //func Int31n(n int32) int32 { return gRand.Int31n(n) } 50 | //func Int63() int64 { return gRand.Int63() } 51 | //func Int63n(n int64) int64 { return gRand.Int63n(n) } 52 | //func Intn(n int) int { return gRand.Intn(n) } 53 | //func NormFloat64() float64 { return gRand.NormFloat64() } 54 | //func Perm(n int) []int { return gRand.Perm(n) } 55 | //func Read(p []byte) (int, error) { return gRand.Read(p) } 56 | //func Seed(seed int64) { gRand.Seed(seed) } 57 | //func Uint32() uint32 { return gRand.Uint32() } 58 | //func Uint64() uint64 { return gRand.Uint64() } 59 | 60 | func SetDefaultRand(r *Rand) { 61 | gRand = r 62 | } 63 | 64 | //范围随机 65 | func (r *Rand) RandRange(min int, max int) int { 66 | if max <= min { 67 | if max == min { 68 | return min 69 | } 70 | return 0 71 | } 72 | return r.rand.Intn(max-min+1) + min 73 | } 74 | 75 | func (r *Rand) RandRangeInt32(min int32, max int32) int { 76 | return r.RandRange(int(min), int(max)) 77 | } 78 | 79 | func (r *Rand) RandRangeInt64(min int64, max int64) int64 { 80 | if max <= min { 81 | if max == min { 82 | return min 83 | } 84 | return 0 85 | } 86 | return r.rand.Int63n(max-min+1) + min 87 | } 88 | 89 | func (r *Rand) Bool() bool { 90 | gRand.Lock() 91 | defer gRand.Unlock() 92 | if gRand.rand.Intn(2) == 0 { 93 | return true 94 | } 95 | return false 96 | } 97 | -------------------------------------------------------------------------------- /rand_car_plate.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | var ( 4 | PROVINCE_CODE []rune = []rune("京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼") 5 | PROVINCE_CODE_LENGTH int = 0 6 | RCPTAIL_STR string = "1234567890ABCDEFGHJKLMNPQRSTUVWXYZ" //车牌尾号 7 | ) 8 | 9 | const ( 10 | RCPTYPE_NORMAL = 0x1 11 | RCPTYPE_NEW_ENERGY = 0x2 12 | ) 13 | 14 | func init() { 15 | PROVINCE_CODE_LENGTH = len(PROVINCE_CODE) 16 | } 17 | 18 | func (r *Rand) CarPlate() string { 19 | return string(PROVINCE_CODE[gRand.rand.Intn(PROVINCE_CODE_LENGTH)]) + r.String(1, RST_UPPER) + r.StringLib(5, &RCPTAIL_STR) 20 | } 21 | 22 | //新能源车牌 6位 23 | func (r *Rand) CarPlateNewEnergy() string { 24 | return string(PROVINCE_CODE[gRand.rand.Intn(PROVINCE_CODE_LENGTH)]) + r.String(1, RST_UPPER) + r.StringLib(6, &RCPTAIL_STR) 25 | } 26 | -------------------------------------------------------------------------------- /rand_ip.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | import ( 4 | "net" 5 | "strconv" 6 | "strings" 7 | ) 8 | 9 | var gIPs = []string{"58.14.0.0", 10 | "58.16.0.0", 11 | "58.24.0.0", 12 | "58.30.0.0", 13 | "58.32.0.0", 14 | "58.66.0.0", 15 | "58.68.128.0", 16 | "58.82.0.0", 17 | "58.87.64.0", 18 | "58.99.128.0", 19 | "58.100.0.0", 20 | "58.116.0.0", 21 | "58.128.0.0", 22 | "58.144.0.0", 23 | "58.154.0.0", 24 | "58.192.0.0", 25 | "58.240.0.0", 26 | "59.32.0.0", 27 | "59.64.0.0", 28 | "59.80.0.0", 29 | "59.107.0.0", 30 | "59.108.0.0", 31 | "59.151.0.0", 32 | "59.155.0.0", 33 | "59.172.0.0", 34 | "59.191.0.0", 35 | "59.191.240.0", 36 | "59.192.0.0", 37 | "60.0.0.0", 38 | "60.55.0.0", 39 | "60.63.0.0", 40 | "60.160.0.0", 41 | "60.194.0.0", 42 | "60.200.0.0", 43 | "60.208.0.0", 44 | "60.232.0.0", 45 | "60.235.0.0", 46 | "60.245.128.0", 47 | "60.247.0.0", 48 | "60.252.0.0", 49 | "60.253.128.0", 50 | "60.255.0.0", 51 | "61.4.80.0", 52 | "61.4.176.0", 53 | "61.8.160.0", 54 | "61.28.0.0", 55 | "61.29.128.0", 56 | "61.45.128.0", 57 | "61.47.128.0", 58 | "61.48.0.0", 59 | "61.87.192.0", 60 | "61.128.0.0", 61 | "61.232.0.0", 62 | "61.236.0.0", 63 | "61.240.0.0", 64 | "114.28.0.0", 65 | "114.54.0.0", 66 | "114.60.0.0", 67 | "114.64.0.0", 68 | "114.68.0.0", 69 | "114.80.0.0", 70 | "116.1.0.0", 71 | "116.2.0.0", 72 | "116.4.0.0", 73 | "116.8.0.0", 74 | "116.13.0.0", 75 | "116.16.0.0", 76 | "116.52.0.0", 77 | "116.56.0.0", 78 | "116.58.128.0", 79 | "116.58.208.0", 80 | "116.60.0.0", 81 | "116.66.0.0", 82 | "116.69.0.0", 83 | "116.70.0.0", 84 | "116.76.0.0", 85 | "116.89.144.0", 86 | "116.90.184.0", 87 | "116.95.0.0", 88 | "116.112.0.0", 89 | "116.116.0.0", 90 | "116.128.0.0", 91 | "116.192.0.0", 92 | "116.193.16.0", 93 | "116.193.32.0", 94 | "116.194.0.0", 95 | "116.196.0.0", 96 | "116.198.0.0", 97 | "116.199.0.0", 98 | "116.199.128.0", 99 | "116.204.0.0", 100 | "116.207.0.0", 101 | "116.208.0.0", 102 | "116.212.160.0", 103 | "116.213.64.0", 104 | "116.213.128.0", 105 | "116.214.32.0", 106 | "116.214.64.0", 107 | "116.214.128.0", 108 | "116.215.0.0", 109 | "116.216.0.0", 110 | "116.224.0.0", 111 | "116.242.0.0", 112 | "116.244.0.0", 113 | "116.248.0.0", 114 | "116.252.0.0", 115 | "116.254.128.0", 116 | "116.255.128.0", 117 | "117.8.0.0", 118 | "117.21.0.0", 119 | "117.22.0.0", 120 | "117.24.0.0", 121 | "117.32.0.0", 122 | "117.40.0.0", 123 | "117.44.0.0", 124 | "117.48.0.0", 125 | "117.53.48.0", 126 | "117.53.176.0", 127 | "117.57.0.0", 128 | "117.58.0.0", 129 | "117.59.0.0", 130 | "117.60.0.0", 131 | "117.64.0.0", 132 | "117.72.0.0", 133 | "117.74.64.0", 134 | "117.74.128.0", 135 | "117.75.0.0", 136 | "117.76.0.0", 137 | "117.80.0.0", 138 | "117.100.0.0", 139 | "117.103.16.0", 140 | "117.103.128.0", 141 | "117.106.0.0", 142 | "117.112.0.0", 143 | "117.120.64.0", 144 | "117.120.128.0", 145 | "117.121.0.0", 146 | "117.121.128.0", 147 | "117.121.192.0", 148 | "117.122.128.0", 149 | "117.124.0.0", 150 | "117.128.0.0", 151 | "118.24.0.0", 152 | "118.64.0.0", 153 | "118.66.0.0", 154 | "118.67.112.0", 155 | "118.72.0.0", 156 | "118.80.0.0", 157 | "118.84.0.0", 158 | "118.88.32.0", 159 | "118.88.64.0", 160 | "118.88.128.0", 161 | "118.89.0.0", 162 | "118.91.240.0", 163 | "118.102.16.0", 164 | "118.112.0.0", 165 | "118.120.0.0", 166 | "118.124.0.0", 167 | "118.126.0.0", 168 | "118.132.0.0", 169 | "118.144.0.0", 170 | "118.178.0.0", 171 | "118.180.0.0", 172 | "118.184.0.0", 173 | "118.192.0.0", 174 | "118.212.0.0", 175 | "118.224.0.0", 176 | "118.228.0.0", 177 | "118.230.0.0", 178 | "118.239.0.0", 179 | "118.242.0.0", 180 | "118.244.0.0", 181 | "118.248.0.0", 182 | "119.0.0.0", 183 | "119.2.0.0", 184 | "119.2.128.0", 185 | "119.3.0.0", 186 | "119.4.0.0", 187 | "119.8.0.0", 188 | "119.10.0.0", 189 | "119.15.136.0", 190 | "119.16.0.0", 191 | "119.18.192.0", 192 | "119.18.208.0", 193 | "119.18.224.0", 194 | "119.19.0.0", 195 | "119.20.0.0", 196 | "119.27.64.0", 197 | "119.27.160.0", 198 | "119.27.192.0", 199 | "119.28.0.0", 200 | "119.30.48.0", 201 | "119.31.192.0", 202 | "119.32.0.0", 203 | "119.40.0.0", 204 | "119.40.64.0", 205 | "119.40.128.0", 206 | "119.41.0.0", 207 | "119.42.0.0", 208 | "119.42.136.0", 209 | "119.42.224.0", 210 | "119.44.0.0", 211 | "119.48.0.0", 212 | "119.57.0.0", 213 | "119.58.0.0", 214 | "119.59.128.0", 215 | "119.60.0.0", 216 | "119.62.0.0", 217 | "119.63.32.0", 218 | "119.75.208.0", 219 | "119.78.0.0", 220 | "119.80.0.0", 221 | "119.84.0.0", 222 | "119.88.0.0", 223 | "119.96.0.0", 224 | "119.108.0.0", 225 | "119.112.0.0", 226 | "119.128.0.0", 227 | "119.144.0.0", 228 | "119.148.160.0", 229 | "119.161.128.0", 230 | "119.162.0.0", 231 | "119.164.0.0", 232 | "119.176.0.0", 233 | "119.232.0.0", 234 | "119.235.128.0", 235 | "119.248.0.0", 236 | "119.253.0.0", 237 | "119.254.0.0", 238 | "120.0.0.0", 239 | "120.24.0.0", 240 | "120.30.0.0", 241 | "120.32.0.0", 242 | "120.48.0.0", 243 | "120.52.0.0", 244 | "120.64.0.0", 245 | "120.72.32.0", 246 | "120.72.128.0", 247 | "120.76.0.0", 248 | "120.80.0.0", 249 | "120.90.0.0", 250 | "120.92.0.0", 251 | "120.94.0.0", 252 | "120.128.0.0", 253 | "120.136.128.0", 254 | "120.137.0.0", 255 | "120.192.0.0", 256 | "121.0.16.0", 257 | "121.4.0.0", 258 | "121.8.0.0", 259 | "121.16.0.0", 260 | "121.32.0.0", 261 | "121.40.0.0", 262 | "121.46.0.0", 263 | "121.48.0.0", 264 | "121.51.0.0", 265 | "121.52.160.0", 266 | "121.52.208.0", 267 | "121.52.224.0", 268 | "121.55.0.0", 269 | "121.56.0.0", 270 | "121.58.0.0", 271 | "121.58.144.0", 272 | "121.59.0.0", 273 | "121.60.0.0", 274 | "121.68.0.0", 275 | "121.76.0.0", 276 | "121.79.128.0", 277 | "121.89.0.0", 278 | "121.100.128.0", 279 | "121.101.208.0", 280 | "121.192.0.0", 281 | "121.201.0.0", 282 | "121.204.0.0", 283 | "121.224.0.0", 284 | "121.248.0.0", 285 | "121.255.0.0", 286 | "122.0.64.0", 287 | "122.0.128.0", 288 | "122.4.0.0", 289 | "122.8.0.0", 290 | "122.48.0.0", 291 | "122.49.0.0", 292 | "122.51.0.0", 293 | "122.64.0.0", 294 | "122.96.0.0", 295 | "122.102.0.0", 296 | "122.102.64.0", 297 | "122.112.0.0", 298 | "122.119.0.0", 299 | "122.136.0.0", 300 | "122.144.128.0", 301 | "122.152.192.0", 302 | "122.156.0.0", 303 | "122.192.0.0", 304 | "122.198.0.0", 305 | "122.200.64.0", 306 | "122.204.0.0", 307 | "122.224.0.0", 308 | "122.240.0.0", 309 | "122.248.48.0", 310 | "123.0.128.0", 311 | "123.4.0.0", 312 | "123.8.0.0", 313 | "123.49.128.0", 314 | "123.52.0.0", 315 | "123.56.0.0", 316 | "123.64.0.0", 317 | "123.96.0.0", 318 | "123.98.0.0", 319 | "123.99.128.0", 320 | "123.100.0.0", 321 | "123.101.0.0", 322 | "123.103.0.0", 323 | "123.108.128.0", 324 | "123.108.208.0", 325 | "123.112.0.0", 326 | "123.128.0.0", 327 | "123.136.80.0", 328 | "123.137.0.0", 329 | "123.138.0.0", 330 | "123.144.0.0", 331 | "123.160.0.0", 332 | "123.176.80.0", 333 | "123.177.0.0", 334 | "123.178.0.0", 335 | "123.180.0.0", 336 | "123.184.0.0", 337 | "123.196.0.0", 338 | "123.199.128.0", 339 | "123.206.0.0", 340 | "123.232.0.0", 341 | "123.242.0.0", 342 | "123.244.0.0", 343 | "123.249.0.0", 344 | "123.253.0.0", 345 | "124.6.64.0", 346 | "124.14.0.0", 347 | "124.16.0.0", 348 | "124.20.0.0", 349 | "124.28.192.0", 350 | "124.29.0.0", 351 | "124.31.0.0", 352 | "124.40.112.0", 353 | "124.40.128.0", 354 | "124.42.0.0", 355 | "124.47.0.0", 356 | "124.64.0.0", 357 | "124.66.0.0", 358 | "124.67.0.0", 359 | "124.68.0.0", 360 | "124.72.0.0", 361 | "124.88.0.0", 362 | "124.108.8.0", 363 | "124.108.40.0", 364 | "124.112.0.0", 365 | "124.126.0.0", 366 | "124.128.0.0", 367 | "124.147.128.0", 368 | "124.156.0.0", 369 | "124.160.0.0", 370 | "124.172.0.0", 371 | "124.192.0.0", 372 | "124.196.0.0", 373 | "124.200.0.0", 374 | "124.220.0.0", 375 | "124.224.0.0", 376 | "124.240.0.0", 377 | "124.240.128.0", 378 | "124.242.0.0", 379 | "124.243.192.0", 380 | "124.248.0.0", 381 | "124.249.0.0", 382 | "124.250.0.0", 383 | "124.254.0.0", 384 | "125.31.192.0", 385 | "125.32.0.0", 386 | "125.58.128.0", 387 | "125.61.128.0", 388 | "125.62.0.0", 389 | "125.64.0.0", 390 | "125.96.0.0", 391 | "125.98.0.0", 392 | "125.104.0.0", 393 | "125.112.0.0", 394 | "125.169.0.0", 395 | "125.171.0.0", 396 | "125.208.0.0", 397 | "125.210.0.0", 398 | "125.213.0.0", 399 | "125.214.96.0", 400 | "125.215.0.0", 401 | "125.216.0.0", 402 | "125.254.128.0", 403 | "134.196.0.0", 404 | "159.226.0.0", 405 | "161.207.0.0", 406 | "162.105.0.0", 407 | "166.111.0.0", 408 | "167.139.0.0", 409 | "168.160.0.0", 410 | "169.211.1.0", 411 | "192.83.122.0", 412 | "192.83.169.0", 413 | "192.124.154.0", 414 | "192.188.170.0", 415 | "198.17.7.0", 416 | "202.0.110.0", 417 | "202.0.176.0", 418 | "202.4.128.0", 419 | "202.4.252.0", 420 | "202.8.128.0", 421 | "202.10.64.0", 422 | "202.14.88.0", 423 | "202.14.235.0", 424 | "202.14.236.0", 425 | "202.14.238.0", 426 | "202.20.120.0", 427 | "202.22.248.0", 428 | "202.38.0.0", 429 | "202.38.64.0", 430 | "202.38.128.0", 431 | "202.38.136.0", 432 | "202.38.138.0", 433 | "202.38.140.0", 434 | "202.38.146.0", 435 | "202.38.149.0", 436 | "202.38.150.0", 437 | "202.38.152.0", 438 | "202.38.156.0", 439 | "202.38.158.0", 440 | "202.38.160.0", 441 | "202.38.164.0", 442 | "202.38.168.0", 443 | "202.38.176.0", 444 | "202.38.184.0", 445 | "202.38.192.0", 446 | "202.41.152.0", 447 | "202.41.240.0", 448 | "202.43.144.0", 449 | "202.46.32.0", 450 | "202.46.224.0", 451 | "202.60.112.0", 452 | "202.63.248.0", 453 | "202.69.4.0", 454 | "202.69.16.0", 455 | "202.70.0.0", 456 | "202.74.8.0", 457 | "202.75.208.0", 458 | "202.85.208.0", 459 | "202.90.0.0", 460 | "202.90.224.0", 461 | "202.90.252.0", 462 | "202.91.0.0", 463 | "202.91.128.0", 464 | "202.91.176.0", 465 | "202.91.224.0", 466 | "202.92.0.0", 467 | "202.92.252.0", 468 | "202.93.0.0", 469 | "202.93.252.0", 470 | "202.95.0.0", 471 | "202.95.252.0", 472 | "202.96.0.0", 473 | "202.112.0.0", 474 | "202.120.0.0", 475 | "202.122.0.0", 476 | "202.122.32.0", 477 | "202.122.64.0", 478 | "202.122.112.0", 479 | "202.122.128.0", 480 | "202.123.96.0", 481 | "202.124.24.0", 482 | "202.125.176.0", 483 | "202.127.0.0", 484 | "202.127.12.0", 485 | "202.127.16.0", 486 | "202.127.40.0", 487 | "202.127.48.0", 488 | "202.127.112.0", 489 | "202.127.128.0", 490 | "202.127.160.0", 491 | "202.127.192.0", 492 | "202.127.208.0", 493 | "202.127.212.0", 494 | "202.127.216.0", 495 | "202.127.224.0", 496 | "202.130.0.0", 497 | "202.130.224.0", 498 | "202.131.16.0", 499 | "202.131.48.0", 500 | "202.131.208.0", 501 | "202.136.48.0", 502 | "202.136.208.0", 503 | "202.136.224.0", 504 | "202.141.160.0", 505 | "202.142.16.0", 506 | "202.143.16.0", 507 | "202.148.96.0", 508 | "202.149.160.0", 509 | "202.149.224.0", 510 | "202.150.16.0", 511 | "202.152.176.0", 512 | "202.153.48.0", 513 | "202.158.160.0", 514 | "202.160.176.0", 515 | "202.164.0.0", 516 | "202.164.25.0", 517 | "202.165.96.0", 518 | "202.165.176.0", 519 | "202.165.208.0", 520 | "202.168.160.0", 521 | "202.170.128.0", 522 | "202.170.216.0", 523 | "202.173.8.0", 524 | "202.173.224.0", 525 | "202.179.240.0", 526 | "202.180.128.0", 527 | "202.181.112.0", 528 | "202.189.80.0", 529 | "202.192.0.0", 530 | "203.18.50.0", 531 | "203.79.0.0", 532 | "203.80.144.0", 533 | "203.81.16.0", 534 | "203.83.56.0", 535 | "203.86.0.0", 536 | "203.86.64.0", 537 | "203.88.32.0", 538 | "203.88.192.0", 539 | "203.89.0.0", 540 | "203.90.0.0", 541 | "203.90.128.0", 542 | "203.90.192.0", 543 | "203.91.32.0", 544 | "203.91.96.0", 545 | "203.91.120.0", 546 | "203.92.0.0", 547 | "203.92.160.0", 548 | "203.93.0.0", 549 | "203.94.0.0", 550 | "203.95.0.0", 551 | "203.95.96.0", 552 | "203.99.16.0", 553 | "203.99.80.0", 554 | "203.100.32.0", 555 | "203.100.80.0", 556 | "203.100.96.0", 557 | "203.100.192.0", 558 | "203.110.160.0", 559 | "203.118.192.0", 560 | "203.119.24.0", 561 | "203.119.32.0", 562 | "203.128.32.0", 563 | "203.128.96.0", 564 | "203.130.32.0", 565 | "203.132.32.0", 566 | "203.134.240.0", 567 | "203.135.96.0", 568 | "203.135.160.0", 569 | "203.142.219.0", 570 | "203.148.0.0", 571 | "203.152.64.0", 572 | "203.156.192.0", 573 | "203.158.16.0", 574 | "203.161.192.0", 575 | "203.166.160.0", 576 | "203.171.224.0", 577 | "203.174.7.0", 578 | "203.174.96.0", 579 | "203.175.128.0", 580 | "203.175.192.0", 581 | "203.176.168.0", 582 | "203.184.80.0", 583 | "203.187.160.0", 584 | "203.190.96.0", 585 | "203.191.16.0", 586 | "203.191.64.0", 587 | "203.191.144.0", 588 | "203.192.0.0", 589 | "203.196.0.0", 590 | "203.207.64.0", 591 | "203.207.128.0", 592 | "203.208.0.0", 593 | "203.208.16.0", 594 | "203.208.32.0", 595 | "203.209.224.0", 596 | "203.212.0.0", 597 | "203.212.80.0", 598 | "203.222.192.0", 599 | "203.223.0.0", 600 | "210.2.0.0", 601 | "210.5.0.0", 602 | "210.5.144.0", 603 | "210.12.0.0", 604 | "210.14.64.0", 605 | "210.14.112.0", 606 | "210.14.128.0", 607 | "210.15.0.0", 608 | "210.15.128.0", 609 | "210.16.128.0", 610 | "210.21.0.0", 611 | "210.22.0.0", 612 | "210.23.32.0", 613 | "210.25.0.0", 614 | "210.26.0.0", 615 | "210.28.0.0", 616 | "210.32.0.0", 617 | "210.51.0.0", 618 | "210.52.0.0", 619 | "210.56.192.0", 620 | "210.72.0.0", 621 | "210.76.0.0", 622 | "210.78.0.0", 623 | "210.79.64.0", 624 | "210.79.224.0", 625 | "210.82.0.0", 626 | "210.87.128.0", 627 | "210.185.192.0", 628 | "210.192.96.0", 629 | "211.64.0.0", 630 | "211.80.0.0", 631 | "211.96.0.0", 632 | "211.136.0.0", 633 | "211.144.0.0", 634 | "211.160.0.0", 635 | "218.0.0.0", 636 | "218.56.0.0", 637 | "218.64.0.0", 638 | "218.96.0.0", 639 | "218.104.0.0", 640 | "218.108.0.0", 641 | "218.185.192.0", 642 | "218.192.0.0", 643 | "218.240.0.0", 644 | "218.249.0.0", 645 | "219.72.0.0", 646 | "219.82.0.0", 647 | "219.128.0.0", 648 | "219.216.0.0", 649 | "219.224.0.0", 650 | "219.242.0.0", 651 | "219.244.0.0", 652 | "220.101.192.0", 653 | "220.112.0.0", 654 | "220.152.128.0", 655 | "220.154.0.0", 656 | "220.160.0.0", 657 | "220.192.0.0", 658 | "220.231.0.0", 659 | "220.231.128.0", 660 | "220.232.64.0", 661 | "220.234.0.0", 662 | "220.242.0.0", 663 | "220.248.0.0", 664 | "220.252.0.0", 665 | "221.0.0.0", 666 | "221.8.0.0", 667 | "221.12.0.0", 668 | "221.12.128.0", 669 | "221.13.0.0", 670 | "221.14.0.0", 671 | "221.122.0.0", 672 | "221.129.0.0", 673 | "221.130.0.0", 674 | "221.133.224.0", 675 | "221.136.0.0", 676 | "221.172.0.0", 677 | "221.176.0.0", 678 | "221.192.0.0", 679 | "221.196.0.0", 680 | "221.198.0.0", 681 | "221.199.0.0", 682 | "221.199.128.0", 683 | "221.199.192.0", 684 | "221.199.224.0", 685 | "221.200.0.0", 686 | "221.208.0.0", 687 | "221.224.0.0", 688 | "222.16.0.0", 689 | "222.32.0.0", 690 | "222.64.0.0", 691 | "222.125.0.0", 692 | "222.126.128.0", 693 | "222.128.0.0", 694 | "222.160.0.0", 695 | "222.168.0.0", 696 | "222.176.0.0", 697 | "222.192.0.0", 698 | "222.240.0.0", 699 | "222.248.0.0", 700 | } 701 | 702 | func (r *Rand) ChineseIP() net.IP { 703 | arr := strings.Split(gIPs[r.Intn(len(gIPs))], ".") 704 | for i, _ := range arr { 705 | if arr[i] == "0" { 706 | arr[i] = strconv.Itoa(r.Intn(254) + 1) 707 | } 708 | } 709 | ip := strings.Join(arr, ".") 710 | 711 | return net.ParseIP(ip) 712 | } 713 | 714 | func (r *Rand) ChineseIPStr() string { 715 | return r.ChineseIP().String() 716 | } 717 | 718 | func (r *Rand) Port() int { 719 | return r.RandRange(1024, 65535) 720 | } 721 | 722 | func (r *Rand) IPAddress() string { 723 | return r.ChineseIP().String() + ":" + strconv.Itoa(r.Port()) 724 | } 725 | -------------------------------------------------------------------------------- /rand_name.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | var ( 4 | gFirstNameList []string = []string{"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "锺", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "麴", "家", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "历", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "溥", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阳", "郁", "胥", "能", "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "僪", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", "向", "古", "易", "慎", "戈", "廖", "庾", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文", "寇", "广", "禄", "阙", "东", "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "竺", "权", "逮", "盍", "益", "桓", "公", "万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻人", "东方", "赫连", "皇甫", "尉迟", "公羊", "澹台", "公冶", "宗政", "濮阳", "淳于", "单于", "太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "钟离", "宇文", "长孙", "慕容", "司徒", "司空", "召", "有", "舜", "叶赫那拉", "丛", "岳", "寸", "贰", "皇", "侨", "彤", "竭", "端", "赫", "实", "甫", "集", "象", "翠", "狂", "辟", "典", "良", "函", "芒", "苦", "其", "京", "中", "夕", "之", "章佳", "那拉", "冠", "宾", "香", "果", "依尔根觉罗", "依尔觉罗", "萨嘛喇", "赫舍里", "额尔德特", "萨克达", "钮祜禄", "他塔喇", "喜塔腊", "讷殷富察", "叶赫那兰", "库雅喇", "瓜尔佳", "舒穆禄", "爱新觉罗", "索绰络", "纳喇", "乌雅", "范姜", "碧鲁", "张廖", "张简", "图门", "太史", "公叔", "乌孙", "完颜", "马佳", "佟佳", "富察", "费莫", "蹇", "称", "诺", "来", "多", "繁", "戊", "朴", "回", "毓", "税", "荤", "靖", "绪", "愈", "硕", "牢", "买", "但", "巧", "枚", "撒", "泰", "秘", "亥", "绍", "以", "壬", "森", "斋", "释", "奕", "姒", "朋", "求", "羽", "用", "占", "真", "穰", "翦", "闾", "漆", "贵", "代", "贯", "旁", "崇", "栋", "告", "休", "褒", "谏", "锐", "皋", "闳", "在", "歧", "禾", "示", "是", "委", "钊", "频", "嬴", "呼", "大", "威", "昂", "律", "冒", "保", "系", "抄", "定", "化", "莱", "校", "么", "抗", "祢", "綦", "悟", "宏", "功", "庚", "务", "敏", "捷", "拱", "兆", "丑", "丙", "畅", "苟", "随", "类", "卯", "俟", "友", "答", "乙", "允", "甲", "留", "尾", "佼", "玄", "乘", "裔", "延", "植", "环", "矫", "赛", "昔", "侍", "度", "旷", "遇", "偶", "前", "由", "咎", "塞", "敛", "受", "泷", "袭", "衅", "叔", "圣", "御", "夫", "仆", "镇", "藩", "邸", "府", "掌", "首", "员", "焉", "戏", "可", "智", "尔", "凭", "悉", "进", "笃", "厚", "仁", "业", "肇", "资", "合", "仍", "九", "衷", "哀", "刑", "俎", "仵", "圭", "夷", "徭", "蛮", "汗", "孛", "乾", "帖", "罕", "洛", "淦", "洋", "邶", "郸", "郯", "邗", "邛", "剑", "虢", "隋", "蒿", "茆", "菅", "苌", "树", "桐", "锁", "钟", "机", "盘", "铎", "斛", "玉", "线", "针", "箕", "庹", "绳", "磨", "蒉", "瓮", "弭", "刀", "疏", "牵", "浑", "恽", "势", "世", "仝", "同", "蚁", "止", "戢", "睢", "冼", "种", "涂", "肖", "己", "泣", "潜", "卷", "脱", "谬", "蹉", "赧", "浮", "顿", "说", "次", "错", "念", "夙", "斯", "完", "丹", "表", "聊", "源", "姓", "吾", "寻", "展", "出", "不", "户", "闭", "才", "无", "书", "学", "愚", "本", "性", "雪", "霜", "烟", "寒", "少", "字", "桥", "板", "斐", "独", "千", "诗", "嘉", "扬", "善", "揭", "祈", "析", "赤", "紫", "青", "柔", "刚", "奇", "拜", "佛", "陀", "弥", "阿", "素", "长", "僧", "隐", "仙", "隽", "宇", "祭", "酒", "淡", "塔", "琦", "闪", "始", "星", "南", "天", "接", "波", "碧", "速", "禚", "腾", "潮", "镜", "似", "澄", "潭", "謇", "纵", "渠", "奈", "风", "春", "濯", "沐", "茂", "英", "兰", "檀", "藤", "枝", "检", "生", "折", "登", "驹", "骑", "貊", "虎", "肥", "鹿", "雀", "野", "禽", "飞", "节", "宜", "鲜", "粟", "栗", "豆", "帛", "官", "布", "衣", "藏", "宝", "钞", "银", "门", "盈", "庆", "喜", "及", "普", "建", "营", "巨", "望", "希", "道", "载", "声", "漫", "犁", "力", "贸", "勤", "革", "改", "兴", "亓", "睦", "修", "信", "闽", "北", "守", "坚", "勇", "汉", "练", "尉", "士", "旅", "五", "令", "将", "旗", "军", "行", "奉", "敬", "恭", "仪", "母", "堂", "丘", "义", "礼", "慈", "孝", "理", "伦", "卿", "问", "永", "辉", "位", "让", "尧", "依", "犹", "介", "承", "市", "所", "苑", "杞", "剧", "第", "零", "谌", "招", "续", "达", "忻", "六", "鄞", "战", "迟", "候", "宛", "励", "粘", "萨", "邝", "覃", "辜", "初", "楼", "城", "区", "局", "台", "原", "考", "妫", "纳", "泉", "老", "清", "德", "卑", "过", "麦", "曲", "竹", "百", "福", "言", "第五", "佟", "爱", "年", "笪", "谯", "哈", "墨", "南宫", "赏", "伯", "佴", "佘", "牟", "商", "西门", "东门", "左丘", "梁丘", "琴", "后", "况", "亢", "缑", "帅", "微生", "羊舌", "海", "归", "呼延", "南门", "东郭", "百里", "钦", "鄢", "汝", "法", "闫", "楚", "晋", "谷梁", "宰父", "夹谷", "拓跋", "壤驷", "乐正", "漆雕", "公西", "巫马", "端木", "颛孙", "子车", "督", "仉", "司寇", "亓官", "鲜于", "锺离", "盖", "逯", "库", "郏", "逢", "阴", "薄", "厉", "稽", "闾丘", "公良", "段干", "开", "光", "操", "瑞", "眭", "泥", "运", "摩", "伟", "铁", "迮"} 5 | 6 | gSecondNameList string = "一二三四五六七八九十瑞凡佳涛昌进林有坚和彪博诚先敬震振壮会群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发成康星光天达安岩中茂武新利清飞彬富顺信子杰楠榕风航弘" 7 | ) 8 | 9 | func (r *Rand) ChineseName() string { 10 | firstName := r.StringArray(&gFirstNameList) 11 | secondName := r.RangeString(&gSecondNameList) 12 | if r.Bool() { 13 | secondName += r.RangeString(&gSecondNameList) 14 | } 15 | return firstName + secondName 16 | } 17 | -------------------------------------------------------------------------------- /rand_string.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | const ( 4 | RST_LOWER = 0x1 5 | RST_UPPER = 0x2 6 | RST_NUMBER = 0x4 7 | RST_SYMBOL = 0x8 8 | ) 9 | 10 | const ( 11 | gcLowerString = "qwertyuiopasdfghjklzxcvbnm" 12 | gcUpperString = "QWERTYUIOPASDFGHJKLZXCVBNM" 13 | gcNumberString = "1234567890" 14 | gcSymbolString = "`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?" 15 | ) 16 | 17 | func (r *Rand) String(length int, flag int) string { 18 | str := "" 19 | if flag == 0 { 20 | str = gcLowerString + gcUpperString + gcNumberString + gcSymbolString 21 | } else { 22 | if flag&RST_LOWER != 0 { 23 | str += gcLowerString 24 | } 25 | if flag&RST_UPPER != 0 { 26 | str += gcUpperString 27 | } 28 | if flag&RST_NUMBER != 0 { 29 | str += gcNumberString 30 | } 31 | if flag&RST_SYMBOL != 0 { 32 | str += gcSymbolString 33 | } 34 | } 35 | 36 | return r.StringLib(length, &str) 37 | } 38 | 39 | func (r *Rand) StringLib(length int, str *string) string { 40 | _s := "" 41 | for i := 0; i < length; i++ { 42 | _s += r.RangeString(str) 43 | } 44 | return _s 45 | } 46 | 47 | func (r *Rand) StringArray(list *[]string) string { 48 | return (*list)[r.rand.Intn(len(*list))] 49 | } 50 | 51 | func (r *Rand) RangeString(s *string) string { 52 | gRand.Lock() 53 | defer gRand.Unlock() 54 | str := []rune(*s) 55 | index := gRand.rand.Intn(len(str)) 56 | return string(str[index]) 57 | } 58 | -------------------------------------------------------------------------------- /rand_test.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func TestRand(t *testing.T) { 8 | t.Log(Int(), Intn(10)) 9 | t.Log(Int32(), Int32n(10)) 10 | t.Log(Int64(), Int64n(10)) 11 | t.Log(Float32(), Float64()) 12 | t.Log(Perm(10)) 13 | t.Log(RandRange(1, 3), 14 | RandRangeInt32(1291212412, 2091212412), 15 | RandRangeInt64(129121241212912124, 229121241212912124)) 16 | t.Log(Bool()) 17 | 18 | t.Log(String(32, RST_LOWER)) 19 | t.Log(String(32, RST_UPPER)) 20 | t.Log(String(32, RST_NUMBER)) 21 | t.Log(String(32, RST_SYMBOL)) 22 | t.Log(String(32, 0)) 23 | 24 | t.Log(StringArray(&[]string{"张三", "李四", "王五", "赵六"})) 25 | t.Log(CarPlate()) 26 | t.Log(CarPlateNewEnergy()) 27 | t.Log(ChineseName()) 28 | 29 | t.Log(Phone()) 30 | 31 | } 32 | -------------------------------------------------------------------------------- /slice.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | import ( 4 | "fmt" 5 | "reflect" 6 | ) 7 | 8 | func (r *Rand) WeightStringInt64MapOnce(m map[string]int64) string { 9 | length := len(m) 10 | weight := make([]int64, 0, length) 11 | key := make([]string, 0, length) 12 | for k, v := range m { 13 | key = append(key, k) 14 | weight = append(weight, v) 15 | } 16 | 17 | ls, _ := r.WeightSliceNoRepeat(key, func(i int) int64 { 18 | return weight[i] 19 | }, 1) 20 | return key[ls[0]] 21 | } 22 | 23 | func (r *Rand) WeightMapOnce(m map[interface{}]int64) interface{} { 24 | length := len(m) 25 | weight := make([]int64, 0, length) 26 | key := make([]interface{}, 0, length) 27 | for k, v := range m { 28 | key = append(key, k) 29 | weight = append(weight, v) 30 | } 31 | 32 | ls, _ := r.WeightSliceNoRepeat(key, func(i int) int64 { 33 | return weight[i] 34 | }, 1) 35 | return key[ls[0]] 36 | } 37 | 38 | func (r *Rand) WeightSliceNoRepeat(slice interface{}, calcWeight func(i int) int64, count int) ([]int, error) { 39 | if count <= 0 { 40 | return nil, nil 41 | } 42 | 43 | // slice is not slice, return error 44 | v := reflect.ValueOf(slice) 45 | if v.Kind() != reflect.Slice { 46 | return nil, fmt.Errorf("util.RandWeightSlice(): error type %s, need slice", v.Kind()) 47 | } 48 | 49 | // slice is empty, return nil 50 | sLen := v.Len() 51 | if sLen <= 0 { 52 | return nil, nil 53 | } 54 | 55 | // slice not enough, return all item if weight > 0 56 | if count >= sLen { 57 | var rt []int 58 | for i := 0; i < sLen; i++ { 59 | if calcWeight(i) > 0 { 60 | rt = append(rt, i) 61 | } 62 | } 63 | return rt, nil 64 | } 65 | 66 | // get weight 67 | weightList, weightSum := r.getRandSliceWeight(sLen, calcWeight) 68 | if weightSum <= 0 { 69 | return nil, nil 70 | } 71 | 72 | return r.randWeight(count, weightList, weightSum), nil 73 | } 74 | 75 | func (r *Rand) getRandSliceWeight(length int, calcWeight func(i int) int64) ([]int64, int64) { 76 | weightList := make([]int64, length) 77 | var weightSum int64 = 0 78 | for i := 0; i < length; i++ { 79 | weightList[i] = int64(calcWeight(i)) 80 | if weightList[i] < 0 { 81 | weightList[i] = 0 82 | } 83 | weightSum += weightList[i] 84 | } 85 | return weightList, weightSum 86 | } 87 | 88 | func (r *Rand) randWeight(count int, weightList []int64, weightSum int64) []int { 89 | sLen := len(weightList) 90 | var rt []int 91 | for i := 0; i < count && weightSum > 0; i++ { 92 | r := int64(r.Int()) % weightSum 93 | var twa int64 94 | for j := 0; j < sLen; j++ { 95 | twa += weightList[j] 96 | if r < twa { 97 | weightSum -= weightList[j] 98 | weightList[j] = 0 99 | rt = append(rt, j) 100 | break 101 | } 102 | } 103 | } 104 | 105 | return rt 106 | } 107 | -------------------------------------------------------------------------------- /slice_test.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | ) 7 | 8 | func TestSlice(t *testing.T) { 9 | t.Log(time.Now()) 10 | m := map[string]int{} 11 | for i := 0; i < 300; i++ { 12 | v := GetRand().WeightMapOnce(map[interface{}]int64{ 13 | "a": 1, 14 | "b": 2, 15 | }) 16 | m[v.(string)]++ 17 | } 18 | t.Log(m) 19 | } 20 | --------------------------------------------------------------------------------