math/rand paketi
math/rand — tasodifiy sonlar yaratish uchun ishlatiladigan standart paket. O'yinlar, simulyatsiyalar, test ma'lumotlarini yaratish yoki elementlarni tasodifiy tartibda aralashtirish kabi vazifalarda keng qo'llaniladi.
import "math/rand"
[!IMPORTANT]
math/randkriptografik jihatdan xavfsiz emas — ya'ni parollar, tokenlar yoki maxfiy kalitlar yaratish uchun ishlatilmasligi kerak! Bunday maqsadlar uchuncrypto/randpaketidan foydalaning.
Intn()rand.Intn(n) 0 dan n-1 gacha (n dan tashqari) oraliqda tasodifiy butun son qaytaradi:
package main
import (
"fmt"
"math/rand"
)
func main() {
// 0 dan 99 gacha (100 dan tashqari) tasodifiy son
num := rand.Intn(100)
fmt.Println(num)
}
Natija (har safar boshqacha bo'lishi mumkin):
73
[!NOTE] Go 1.20 versiyasidan boshlab,
math/randdasturni ishga tushirgan har safar avtomatik ravishda turlicha "urug'" (seed) bilan boshlanadi. Shuning uchun eski Go kodlarida ko'p uchraydiganrand.Seed(time.Now().UnixNano())qatorini yozish endi shart emas.
Ma'lum bir diapazonda (masalan, 10 dan 20 gacha) tasodifiy son kerak bo'lsa:
min, max := 10, 20
num := min + rand.Intn(max-min+1) // 10 dan 20 gacha (ikkalasi ham kiradi)
Float64()0.0 (kiritiladi) dan 1.0 gacha (kiritilmaydi) oraliqdagi tasodifiy kasr son:
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Float64())
}
Natija (har safar boshqacha):
0.6273588491262540
Shuffle()Kartalar, viktorina savollari yoki har qanday ro'yxatni tasodifiy tartibga solish uchun rand.Shuffle() ishlatiladi:
package main
import (
"fmt"
"math/rand"
)
func main() {
nums := []int{1, 2, 3, 4, 5}
// len(nums) — nechta element borligi
// funksiya ichida i va j pozitsiyalarni almashtirish mantig'i yoziladi
rand.Shuffle(len(nums), func(i, j int) {
nums[i], nums[j] = nums[j], nums[i]
})
fmt.Println(nums)
}
Natija (tartib har safar boshqacha bo'ladi):
[3 1 5 2 4]
rand.New() va NewSource()Ba'zan (masalan, testlarda) "tasodifiy", lekin har safar bir xil natija beradigan sonlar kerak bo'ladi. Buning uchun o'z generatorimizni aniq "urug'" (seed) bilan yaratamiz:
package main
import (
"fmt"
"math/rand"
)
func main() {
// 42 — urug' (seed): shu son bir xil bo'lsa, natijalar ketma-ketligi ham bir xil bo'ladi
r := rand.New(rand.NewSource(42))
fmt.Println(r.Intn(50))
fmt.Println(r.Intn(50))
}
Natija (dasturni necha marta ishga tushirmang, natija doim shunday bo'ladi):
37
5
Bu xususiyat, ayniqsa, avtomatlashtirilgan testlarda "tasodifiy" ma'lumot bilan ishlashni takrorlanadigan qilish uchun juda foydali.
math/rand/v2Go 1.22 versiyasidan boshlab, standart kutubxonaga yangilangan math/rand/v2 paketi qo'shildi — u tezroq ishlaydi va funksiya nomlari biroz o'zgargan (masalan, Intn o'rniga IntN, katta harf bilan):
package main
import (
"fmt"
"math/rand/v2"
)
func main() {
fmt.Println(rand.IntN(100)) // e'tibor bering: Intn emas, IntN
fmt.Println(rand.Float64())
}
[!NOTE] Yangi loyihalarda imkon qadar
math/rand/v2dan foydalanish tavsiya etiladi, lekinmath/randham hali to'liq qo'llab-quvvatlanadi va ko'plab mavjud loyihalarda uchraydi — shuning uchun ikkalasini ham tanish muhim.
| Vazifa | Funksiya |
|---|---|
0 dan n-1 gacha tasodifiy son | rand.Intn(n) |
0.0 dan 1.0 gacha tasodifiy kasr son | rand.Float64() |
| Slaysni tasodifiy aralashtirish | rand.Shuffle() |
| Har safar bir xil ("takrorlanadigan") tasodifiy natija | rand.New(rand.NewSource(urug')) |
| Maxfiy/xavfsizlik uchun tasodifiy qiymat | crypto/rand |