2016-03-15 70 views
0

在Go中生成固定長度隨機數的最快和最簡單的方法是什麼?如何在Go中生成一個固定長度的隨機數?

假設產生8位數字的長號碼,rand.Intn(100000000)的問題是結果可能遠小於8位數字,並且用前導零填充它看起來對我來說不是一個好的答案。

也就是說,我更在意它的長度,關心隨機性的質量。所以我想,對於這個特定的問題,以下是最快和最簡單的方法嗎?

99999999 - rand.Int63n(90000000) 

即,我想Int63n可能是我的情況比Intn更好。這是真的,還是隻是一廂情願?關於整個8位的隨機性,兩者是相同的,還是比另一個更好?

最後,還有比上面更好的方法嗎?

UPDATE:

請不要提供low + rand(hi-low)的答案,因爲每個人都知道這一點。這相當於我現在正在做的事情,它並沒有回答我真正的問題,「關於整個8位數的隨機性,兩者是相同的,還是真的比另一個好?」。

如果沒有人能回答這個問題,我會繪製兩者之間的2-d散點圖,並找出自己...

感謝

+1

您的用例是什麼?對我而言,你似乎想要一個由8位數字組成的字符串,而不是數字*本身*?這個答案可能有所幫助:http://stackoverflow.com/questions/22892120/how-to-generate-a-random-string-of-a-fixed-length-in-golang – Ezra

+0

@Ezra,這個問題實際上是由儘管多次改進性能,仍然無法擺脫這種循環。是的,我確實希望字符串由8位數以上的數字組成。即使是十六進制數字也適合我。關鍵是,我的上述解決方案可以一次完成,我相信這將比那裏最快的解決方案快得多,這遠非簡單。 – xpt

+1

使用零填充沒有問題:如果填充並且仍然是完全隨機的,則隨機數可能以一個或多個零開頭。 – Volker

回答

2

。這是一個一般用途的功能的範圍內產生的數字

func rangeIn(low, hi int) int { 
    return low + rand.Intn(hi-low) 
} 

看到它的Playground

在您的具體情況下,試圖生成8位數字,範圍將是(10000000, 99999999)

0

這取決於您要使用的數值範圍。

  1. 如果允許值範圍[0-99999999]和填充零炭< 8的IP號,然後使用FMT等fmt.Sprintf("%08d",rand.Intn(100000000))

  2. 如果你不希望的填充,其值在範圍[10000000 99999999],然後給它一個基等ranNumber := 10000000 + rand.Intn(90000000)`

相關問題