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

Work in Progress / Сайт в процесі розробки

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

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

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

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

А rand.Float64 поверне випадкове число з плаваючою комою float64 f, 0.0 <= f < 1.0.

    fmt.Println(rand.Float64())

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

    fmt.Print((rand.Float64()*5)+5, ",")
    fmt.Print((rand.Float64() * 5) + 5)
    fmt.Println()

Станадартний генератор чисел детермінований, отже він буде видавати тіж самі послідовності з чисел кожного разу. Щоб отримати послідовності, які будуть мінятись, нам необхідно надати початкове значення, або “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 для довідки про інші випадкові велечини що Go поже запропонувати.

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