Ce face math/rand/v2.Float64
rand.Float64() returnează un float64 între 0.0 (inclus) și 1.0 (exclus), cu toate valorile la fel de probabile. rand.Float32() face același lucru pentru float32.
Pentru un alt interval [a, b) scrii a + rand.Float64()*(b-a). Pentru un eveniment cu probabilitatea p scrii rand.Float64() < p: de exemplu, < 0.3 este adevărat în aproximativ 30% din cazuri.
Ce returnează
Un număr aleatoriu în [0.0, 1.0).
Exemple
Exemplul 1: Temperatură aleatorie între -5 și 15 grade
package main
import (
"fmt"
"math/rand/v2"
)
func main() {
fmt.Println(rand.Float64())
fmt.Println(rand.Float32())
t := -5 + rand.Float64()*20
fmt.Printf("Temperatura în Iași: %.1f °C\n", t)
}
Rezultat posibil (diferă la fiecare rulare)
0.8666632394509921
0.08353585
Temperatura în Iași: 0.9 °C
Exemplul 2: Estimarea lui π prin simulare
Arunci puncte aleatorii în pătratul [0, 1) × [0, 1). Proporția celor care cad în sfertul de cerc este π/4. Generatorul are seed fix, deci rezultatul se repetă.
package main
import (
"fmt"
"math/rand/v2"
)
func main() {
r := rand.New(rand.NewPCG(1, 2))
in := 0
total := 1_000_000
for range total {
x, y := r.Float64(), r.Float64()
if x*x+y*y < 1 {
in++
}
}
fmt.Printf("π ≈ %.4f\n", 4*float64(in)/float64(total))
}
Rezultat
π ≈ 3.1404
Exemplul 3: Eveniment cu probabilitate dată
Ploaia are șanse de 30%. Din 10000 de zile simulate, aproximativ 3000 sunt ploioase.
package main
import (
"fmt"
"math/rand/v2"
)
func main() {
r := rand.New(rand.NewPCG(42, 0))
ploioase := 0
for range 10000 {
if r.Float64() < 0.3 {
ploioase++
}
}
fmt.Println("Zile ploioase:", ploioase)
}
Rezultat
Zile ploioase: 2953
Greșeli frecvente
- Aștepți să primești uneori exact 1.0: intervalul este deschis la dreapta, deci 1.0 nu apare niciodată.
Comenzi înrudite
math/rand/v2.IntN: Returnează un număr întreg aleatoriu din intervalul [0, n): IntN pentru int, plus variantele Int32N, Int64N, UintN, Uint32N, Uint64N.math/rand/v2.NormFloat64: NormFloat64 dă numere cu distribuție normală (media 0, abaterea 1); ExpFloat64 dă numere cu distribuție exponențială (rata 1).