golang生成随机数
生活随笔
收集整理的這篇文章主要介紹了
golang生成随机数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.通過math/rand包生成隨機數
今天剛完成了一個業務模塊,是用golang生成各種類型,且指定范圍的隨機數,還要可選擇是否包含上下限,還要能控制隨機數的精度,今天剛做完,迫不及待記錄一下。
1.1整數類型隨機數:
rand.Seed():設置一個具體的值,隨便給個值都可以,golang是通過這個函數設置的值來生成隨機數,但是有個問題,如果值是固定的,那么生成的隨機數也是固定的,也就是說生成的是偽隨機數,不是真隨機數,所以最方便的辦法就是把時間戳設置進去,因為獲取的時間戳不是固定的。
如果是整數類型的隨機數,這樣就行了,也是寫起來最簡單的一種方法,其他整數類型同理,改一下rand的函數就行,比如生成int64的,改成rand.Int63n()函數就行,但此方法僅限于整數類型的隨機數。
1.2浮點類型隨機數:
rand.Float32():rand自帶的生成一個0與1之間float32類型的隨機數
rand.Float64():rand自帶的生成一個0與1之間float64類型的隨機數
通過rand自帶函數,再加上下面設置的上下限運算,就能夠生成浮點類型隨機數,但是這種方式只能生成不包含上下限的隨機數,包含上下限的生成不了,而且不能控制精度。
1.3用decimal與rand搭配,生成任意類型隨機數:
這種方式,可生成任意類型隨機數,也都可以包含上下限,還能自己控制精度,推薦這種方式
//生成隨機數PRECISION := int32(1000000000) //這個是隨機數的精度和百分比,數值越大,精度越高min := float32(-10.5) //設置隨機數下限max := float32(100.05) //設置隨機數上限minBool := true //是否包含下限maxBool := true //是否包含上限rand.Seed(time.Now().UnixNano())//創建100個隨機數for i := 0; i < 100; i++ {//得到百分比var ratio int32for {ratio = rand.Int31n(PRECISION + 1)//都包含if minBool && maxBool {break}//都不包含if !minBool && !maxBool && ratio != 0 && ratio != PRECISION {break}//包含下限,不包含上限if minBool && !maxBool && ratio != PRECISION {break}//包含上限,不包含下限if !minBool && maxBool && ratio != 0 {break}}// 計算公式(max-min)*ratio/PRECISION + mindec1 := decimal.NewFromFloat32(max).Sub(decimal.NewFromFloat32(min))dec2 := dec1.Mul(decimal.NewFromInt32(ratio))dec3 := dec2.Div(decimal.NewFromInt32(int32(PRECISION)))dec4 := dec3.Add(decimal.NewFromFloat32(min)) //得到隨機數結果number, _ := dec4.Float64() //轉換為number類型num := float32(number) //最終轉換成自己想要的類型,得到最終結果fmt.Print(num, ",")if num == min {fmt.Println("隨機數等于下限---------", num)}if num == max {fmt.Println("隨機數等于上限---------", num)}//脫離范圍if num < min || num > max {fmt.Println("隨機數脫離范圍區間-----", num)}}總結
以上是生活随笔為你收集整理的golang生成随机数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue项目中表格删除数据页码显示注意点
- 下一篇: PCB布局布线中地的设计