Is there any Go function which returns true pseudo random number in every run? What I actually mean is, consider following code,
package main
import (
"fmt"
"rand"
)
func main() {
fmt.Println(rand.Int31n(100))
}
Every time I execute this code, I get the same output. Is there a method that will return different, random results each time that it is called?
The package rand can be used to generate pseudo random numbers, which are generated based on a specific initial value (called "seed").
A popular choice for this initial seed is for example the current time in nanoseconds - a value which will probably differ when you execute your program multiple times. You can initialize the random generator with the current time with something like this:
rand.Seed(time.Now().UnixNano())
(don't forget to import the time package for that)
There is also another package called crypto/rand which can be used to generate better random values (this generator might also take the user's mouse movements, the current heat of the processor and a lot of other factors into account). However, the functions in this package are several times slower and, unless you don't write a pass-phrase generator (or other security related stuff), the normal rand package is probably fine.
You have to seed the RNG first.
I've never used Go, but it's probably rand.Seed(x);
rand.Seed(time.Now().UnixNano())
works on Ubuntu. I spent forever researching rand.Seed(time.Nanoseconds())
. I finally found the Example: Google Search 2.1 on the golang tour.
To sum up the answers above, you can write your own random number generator with rand.Seed(n)
. n must be a different number each time you seed. Here is an example:
func RandomInt(n int) int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(n)
}
func RandomIntFromRange(min int, max int) int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(max - min + 1) + min
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.