Go за Прикладом: Генерація випадкових чисел

Пакет math/rand дозволяє реалізовувати генерацію псевдовипадкових чисел.

package main
import (
    "fmt"
    "math/rand"
    "time"
)
func main() {

Наприклад, rand.Intn повертає випадкове ціле число в діапазоні від нуля до n (0 <= n < 100).

    fmt.Print(rand.Intn(100), ",")
    fmt.Print(rand.Intn(100))
    fmt.Println()

А rand.Float64 поверне випадкове число з плаваючою комою (тип float64) в діапазоні, від нуля до 1-ці (0.0 <= f < 1.0).

    fmt.Println(rand.Float64())

Це може стати корисним для генерації чисел в діапазонах, наприклад 5.0 <= f' < 10.0.

    rand1 := (rand.Float64() * 5) + 5
    rand2 := (rand.Float64() * 5) + 5
    fmt.Println(rand1, ",", rand2)

Станадартний генератор чисел детермінований, отже він буде видавати тіж самі послідовності чисел кожного разу. Щоб отримати послідовності, які будуть мінятись, нам необхідно надати початкове значення, або “seed” (як його ще називають). Зауваження - це не дуже безпечно використовувати випадкові числа які мають триматись в секреті, скористайтесь пакетом crypto/rand якщо ваша ціль генерація більш захищених даних.

    s1 := rand.NewSource(time.Now().UnixNano())
    r1 := rand.New(s1)

Виклик результатного rand.Rand проходить аналогічно функціям пакету rand.

    fmt.Print(r1.Intn(100), ",")
    fmt.Print(r1.Intn(100))
    fmt.Println()

Якщо початковим значенням буде одне і теж число результат, теж, буде однаковий для різних викликів генераторів.

    s2 := rand.NewSource(42)
    r2 := rand.New(s2)
    fmt.Print(r2.Intn(100), ",")
    fmt.Print(r2.Intn(100))
    fmt.Println()
    s3 := rand.NewSource(42)
    r3 := rand.New(s3)
    fmt.Print(r3.Intn(100), ",")
    fmt.Print(r3.Intn(100))
}
$ go run random-numbers.go
81,87
0.6645600532184904
7.1885709359349015 , 7.123187485356329
44,17
5,87
5,87

Щоб отримати довідку по наявним методом генерації випадкових чисел - зверніть увагу на документацію пакету math/rand.

Наступний приклад: Конвертація Тексту в Числа.