math/rand/v2.N în Go

Funcție generică: returnează o valoare aleatorie din [0, n) de același tip întreg ca n, inclusiv time.Duration.

Sintaxă
import "math/rand/v2"

func N[Int intType](n Int) Int

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, dar rand.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.