Ce face math/rand/v2.N
rand.N(n) face ce face IntN, dar este generică: merge pentru orice tip întreg, inclusiv tipuri definite peste un întreg, cum este time.Duration. Rezultatul are exact tipul lui n, fără conversii.
Cel mai des este folosită pentru pauze aleatorii: rand.N(500 * time.Millisecond) dă o durată între 0 și 500 ms, utilă la reîncercări („jitter”), ca mai mulți clienți să nu lovească serverul în același moment.
Ca și IntN, oprește programul cu panic dacă n este ≤ 0. Funcția există doar la nivel de pachet; pe un generator propriu (*rand.Rand) folosești r.Int64N și faci conversia.
Parametri
| Parametru | Descriere |
|---|---|
n |
Limita superioară, exclusă, de orice tip întreg. |
Ce returnează
O valoare aleatorie în [0, n), de tipul lui n.
Exemple
Exemplul 1: Pauză aleatorie înainte de reîncercare
package main
import (
"fmt"
"math/rand/v2"
"time"
)
func main() {
for incercare := 1; incercare <= 3; incercare++ {
pauza := rand.N(500 * time.Millisecond)
fmt.Printf("Încercarea %d: aștept %v\n", incercare, pauza.Round(time.Millisecond))
}
}
Rezultat posibil (diferă la fiecare rulare)
Încercarea 1: aștept 390ms
Încercarea 2: aștept 288ms
Încercarea 3: aștept 166ms
Exemplul 2: Tipul rezultatului urmează tipul lui n
Programul afișează tipul valorilor, nu valorile, deci rezultatul este același la fiecare rulare.
package main
import (
"fmt"
"math/rand/v2"
"time"
)
type Nota uint8
func main() {
fmt.Printf("%T\n", rand.N(10))
fmt.Printf("%T\n", rand.N(int64(1e9)))
fmt.Printf("%T\n", rand.N(time.Second))
n := rand.N(Nota(10)) + 1
fmt.Printf("%T, în [1, 10]: %v\n", n, n >= 1 && n <= 10)
}
Rezultat
int
int64
time.Duration
main.Nota, în [1, 10]: true
Greșeli frecvente
- Scrii
time.Duration(rand.IntN(500)) * time.Millisecond: merge, darrand.N(500 * time.Millisecond)este mai clar și are granularitate de nanosecundă.
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.Int: Returnează un întreg aleatoriu pe tot domeniul tipului: Int, Int32, Int64 (nenegative) și Uint, Uint32, Uint64.