2014-10-02 75 views
1

我試圖產生一個隨機數beetwen最小值和最大值, ,但似乎我迷失了,這是什麼錯誤?生成密碼隨機整數beetwen最小值,最大值

package main 

import (
    "crypto/rand" 
    "encoding/binary" 
    "fmt" 
) 

func genRandNum(min, max int8) int { 
    var num int8 
    binary.Read(rand.Reader, binary.LittleEndian, &num) 
    return int(num*(max-min)+min) 
} 

func main() { 
    // trying to get a random number beetwen -10 and 10 
    fmt.Println(genRandNum(-10,10)) 
} 
+0

即使你有你的工作方式,它會在大多數情況下,使較低的值略微更加頻繁。 jmaloney使用的rand.Int函數是正確的方法;這是它的目的。看看[源文件](http://golang.org/src/pkg/crypto/rand/util.go?s=3072:3134#L96),看看它們是如何解決它的。 – ANisus 2014-10-02 05:36:24

回答

3

這個怎麼樣

func main() { 
    fmt.Println(genRandNum(-10, 10)) 
} 

func genRandNum(min, max int64) int64 { 
    // calculate the max we will be using 
    bg := big.NewInt(max - min) 

    // get big.Int between 0 and bg 
    // in this case 0 to 20 
    n, err := rand.Int(rand.Reader, bg) 
    if err != nil { 
     panic(err) 
    } 

    // add n to min to support the passed in range 
    return n.Int64() + min 
} 

轉到play

+0

請你能解釋你的代碼嗎?謝謝。 – Jzala 2014-10-02 02:54:20

+0

@Jzala我在代碼中添加了一些註釋。它能幫你清理嗎? – jmaloney 2014-10-02 03:09:20

+0

我認爲這裏有一個錯誤。 'rand.Int(rand.Reader,bg)'將產生0到bg-1之間的數字,所以'getRandNum'永遠不會返回10.你可以用'bg:= big.NewInt(max - min + 1) – siritinga 2014-10-02 07:28:55