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  }