教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang随机数

golang随机数

发布时间:2022-01-13   编辑:jiaochengji.com
教程集为您提供golang随机数等资源,欢迎您收藏本站,我们将为您提供最新的golang随机数资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

Go中使用seed得到相同随机数的问题

<h2>一、随机数种类</h2>

伪随机生成的数字是确定的,不论在什么机器、什么时间,只要执行的随机代码一样,那么生成的随机数就一样

根据密码学原理,要想对一个“随机数”进行随机性检验有以下几个标准:

<ul><li>统计学伪随机性 - 在给定的随机比特流样本中,1 的数量大致等于 0 的数量,也就是说,“10”“01”“00”“11” 四者数量大致相等。说人话就是:“一眼看上去是随机的”。</li><li>密码学安全伪随机性 - 就是给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。</li><li>真随机性 - 其定义为随机样本不可重现。</li></ul>

根据以上几个标准,其对应的随机数也就分为以下几类:

<ul><li>伪随机数 - 满足第一个条件的随机数。</li><li>密码学安全的伪随机数 - 同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器计算得出</li><li>真随机数 -同时满足三个条件的随机数</li></ul><h2>
二、随机数生成方法,按概率从小到大</h2> <ol><li>

“crypto/rand” ,真随机,耗时最长。
对于涉及密码类的开发工作一定要用crypto/rand

<pre><code> t, _ := crand.Int(crand.Reader, big.NewInt(10000)) if cmp := big.NewInt(0).Cmp(t); cmp == 0 { </code></pre> </li></ol>

2.“math/rand”,比第4种更快
非并发安全

<pre><code> gRand := mrand.New(mrand.NewSource(time.Now().UnixNano()).(mrand.Source64)) t := gRand.Intn(10000) </code></pre> <ol start="3"><li>

"crypto/rand"生成种子,性能稍输第4种
Golang中两个随机数函数的故事

<pre><code> func NewCryptoSeededSource() mrand.Source { var seed int64 binary.Read(crand.Reader, binary.BigEndian, &seed) return mrand.NewSource(seed) } Rand := mrand.New(NewCryptoSeededSource()) </code></pre> </li><li>

“math/rand”

<pre><code> mrand.Seed(time.Now().UnixNano()) t:= mrand.Intn(10000) </code></pre> </li></ol><h2>
三、生成随机字符串</h2>

一步步提升Go语言生成随机字符串的效率

通常方法:基于随机数生成随机字符串

<pre><code> var defaultLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") // RandomString returns a random string with a fixed length func RandomString(n int, allowedChars ...[]rune) string { var letters []rune if len(allowedChars) == 0 { letters = defaultLetters } else { letters = allowedChars[0] } b := make([]rune, n) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) } </code></pre>

<pre><code> func GenerateUnique() string { var r = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0") uniq := make([]rune, 20) for i := range uniq { rand.Seed(time.Now().UTC().UnixNano() int64(i<<20)) uniq[i] = r[rand.Intn(len(r))] } return string(uniq) } </code></pre> <h2>
四、golang 抽取随机数 随机字符</h2> <ol><li>产生不重复的随机数</li></ol><pre><code> package utils import ( "math/rand" "time" ) var channel chan int64 = make(chan int64, 32) func init() { go func() { var old int64 for { o := rand.New(rand.NewSource(time.Now().UnixNano())).Int63() if old != o { old = o select { case channel <- o: } } } }() } func RandInt64() (r int64) { select { case rand := <-channel: r = rand } return } </code></pre> <ol start="2"><li>随机生成验证码</li></ol><pre><code>/** * size 随机码的位数 * kind 0 // 纯数字 1 // 小写字母 2 // 大写字母 3 // 数字、大小写字母 */ func krand(size int, kind int) []byte { ikind, kinds, result := kind, [][]int{[]int{10, 48}, []int{26, 97}, []int{26, 65}}, make([]byte, size) is_all := kind > 2 || kind < 0 rand.Seed(time.Now().UnixNano()) for i := 0; i < size; i { if is_all { // random ikind ikind = rand.Intn(3) } scope, base := kinds[ikind][0], kinds[ikind][1] result[i] = uint8(base rand.Intn(scope)) } return result } </code></pre> 到此这篇关于“golang随机数”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang随机数
golang map遍历随机的问题
php生成随机产生六位数密码的代码
高性能 golang 生成指定长度随机字符串
js生成指定范围的随机数
php生成指定位数(长度)的随机字符串
php生成随机数的例子
Go实战--golang中各种排序算法实现以及生成随机数
php随机生成4位数字验证码
golang会取代php吗

[关闭]
~ ~