github.com/zhongdalu/gf@v1.0.0/geg/util/grand/rand.go (about) 1 package main 2 3 import ( 4 crand "crypto/rand" 5 "encoding/binary" 6 "fmt" 7 "github.com/zhongdalu/gf/g/os/gtime" 8 mrand "math/rand" 9 "os" 10 "time" 11 ) 12 13 // int 随机 14 func a1() { 15 s1 := mrand.NewSource(time.Now().UnixNano()) 16 r1 := mrand.New(s1) 17 for i := 0; i < 10; i++ { 18 fmt.Printf("%d ", r1.Intn(100)) 19 } 20 fmt.Printf("\n") 21 } 22 23 // 0/1 true/false 随机 24 func a2() { 25 // Go编程这本书上例子. 26 ch := make(chan int, 1) 27 for i := 0; i < 10; i++ { 28 select { 29 case ch <- 0: 30 case ch <- 1: 31 } 32 r := <-ch 33 fmt.Printf("%d ", r) 34 } 35 fmt.Printf("\n") 36 } 37 38 //真随机 -- 用标准库封装好的 39 func a3() { 40 b := make([]byte, 16) 41 // On Unix-like systems, Reader reads from /dev/urandom. 42 // On Windows systems, Reader uses the CryptGenRandom API. 43 _, err := crand.Read(b) //返回长度为0 - 32 的值 44 if err != nil { 45 fmt.Println("[a3] ", err) 46 return 47 } 48 fmt.Println("[a3] b:", b) 49 } 50 51 //真随机 -- 我们直接调真随机文件生成了事。 但注意,它是阻塞式的。 52 func a4() { 53 f, err := os.Open("/dev/random") 54 if err != nil { 55 fmt.Println("[a4] ", err) 56 return 57 } 58 defer f.Close() 59 60 b1 := make([]byte, 16) 61 _, err = f.Read(b1) 62 if err != nil { 63 fmt.Println("[a4] ", err) 64 return 65 } 66 fmt.Println("[a4] Read /dev/random:", b1) 67 } 68 69 // a3 的另一种实现方式 70 func a5() { 71 var ret int32 72 binary.Read(crand.Reader, binary.LittleEndian, &ret) 73 fmt.Println("[a5] ret:", ret) 74 } 75 76 func main() { 77 fmt.Println("a1:", gtime.FuncCost(a1)) 78 fmt.Println("a2:", gtime.FuncCost(a2)) 79 fmt.Println("a3:", gtime.FuncCost(a3)) 80 fmt.Println("a4:", gtime.FuncCost(a4)) 81 fmt.Println("a5:", gtime.FuncCost(a5)) 82 }