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