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  }