2014-10-02 72 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