math/rand/v2.Float64 în Go

Returnează un număr zecimal aleatoriu uniform din intervalul [0.0, 1.0): Float64 sau Float32.

Sintaxă
import "math/rand/v2"

func Float64() float64
func Float32() float32

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).