Golang: math/rand 和 crypto/rand 区别

栏目: IT技术 · 发布时间: 6年前

内容简介:之前发现了golang标准库中又两个rand软件包,开始非常想知道他们之间的差异.Rob Pike的代码

1. 前言

原文地址

之前发现了golang标准库中又两个rand软件包,开始非常想知道他们之间的差异.

math/rand 软件包可以用于简单的游戏,但不能用于真正的随机性。

math/rand
crypto/rand

Rob Pike的代码

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    c := fanIn(boring("Joe"), boring("Ann"))
    for i := 0; i < 10; i++ {
        fmt.Println(<-c)
    }
    fmt.Println("You're both boring; I'm leaving.")
}

func boring(msg string) <-chan string {
    c := make(chan string)
    go func() {
        for i := 0; ; i++ {
            c <- fmt.Sprintf("%s %d", msg, i)
            time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
        }
    }()
    return c
}

// FAN IN
func fanIn(input1, input2 <-chan string) <-chan string {
    c := make(chan string)
    go func() {
        for {
            c <- <-input1
        }
    }()
    go func() {
        for {
            c <- <-input2
        }
    }()
    return c
}

2. Math/rand 伪随机数生成器

实现伪随机数生成器。

随机数由源生成。顶级函数(例如Float64和Int)使用默认的共享源,该源在每次运行程序时都会产生确定的值序列。 如果每次运行需要不同的行为, 请使用种子函数初始化默认的源。 默认的Source可安全地供多个goroutine并发使用,但不是由NewSource创建的Source。

package main

import (
    "fmt"
    "math/rand"
    "time"
)
func init(){
    rand.Seed(time.Now().UTC().UnixNano())
}

func main() {

    // launches 2 generators and the fanIn collector function
    c := fanIn(genrt(), genrt())
    for i := 0; i < 10000; i++ {
        fmt.Println(<-c)
    }
}

func fanIn(a <-chan int, b <-chan int) <-chan string {
    c := make(chan string)
    // launch collector from a to channel
    go func() {
        var count int
        for {
            count += <-a
            c <- fmt.Sprintf("Tally of A is: %d", count)
        }
    }()
    // launch collector from b to channel
    go func() {
        var count int
        for {
            count += <-b
            c <- fmt.Sprintf("Tally of B is: %d", count)
        }
    }()

    return c
}

func genrt() <-chan int {
    c := make(chan int)
    // launch generator of Dice rolls
    go func() {
        for i := 0; ; i++ {
            c <- rand.Intn(6) + 1
            time.Sleep(time.Duration(500 * time.Millisecond))
        }
    }()
    return c
}

打印输出

...
Tally of B is: 17656
Tally of A is: 17438
Tally of A is: 17440
Tally of B is: 17659
Tally of B is: 17660
Tally of A is: 17445

3. Crypto/rand 加密安全的随机数生成器

实现了加密安全的随机数生成器。

package main
import (
    "crypto/rand"
    "fmt"
    "math/big"
    "time"
)

func main() {

    // launches 2 generatores and the fanIn collector function
    c := fanIn(genrt(), genrt())
    for i := 0; i < 10000; i++ {
        fmt.Println(<-c)
    }
}

func fanIn(a <-chan int, b <-chan int) <-chan string {
    c := make(chan string)
    // launch collector from a to channel
    go func() {
        var count int
        for {
            count += <-a
            c <- fmt.Sprintf("Tally of A is: %d", count)
        }
    }()
    // launch collector from b to channel
    go func() {
        var count int
        for {
            count += <-b
            c <- fmt.Sprintf("Tally of B is: %d", count)
        }
    }()

    return c
}

func genrt() <-chan int {
    c := make(chan int)
    // launch generator of Dice rolls
    go func() {
        for i := 0; ; i++ {
            dice, err := rand.Int(rand.Reader, big.NewInt(6))
            if err != nil {
                fmt.Println(err)
            }
            c <- int(dice.Int64()) + 1
            time.Sleep(time.Duration(1 * time.Millisecond))
        }
    }()
    return c
}

打印输出

...
Tally of B is: 17496
Tally of A is: 17570
Tally of A is: 17574
Tally of B is: 17500
Tally of B is: 17505
Tally of A is: 17576

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法分析

数据结构与算法分析

韦斯 (Mark Allen Weiss) / 机械工业出版社 / 2013-2-1 / 79.00元

本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长。本书将算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,并细致讲解精心构造程序的方法,内容全面、缜密严格。 第3版的主要更新如......一起来看看 《数据结构与算法分析》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具