Generazione di numeri casuali

Go:
Generazione di numeri casuali

Come fare:

In Go, i numeri casuali sono generati utilizzando il pacchetto math/rand per numeri pseudo-casuali o crypto/rand per numeri pseudo-casuali criptograficamente sicuri. Esploriamo entrambi.

Usare math/rand per Numeri Pseudo-casuali

Prima, importare il pacchetto math/rand e il pacchetto time per inizializzare il generatore. Inizializzare assicura che si ottenga una sequenza diversa di numeri ad ogni esecuzione.

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	fmt.Println("Un numero casuale:", rand.Intn(100)) // Genera un numero tra 0 e 99
}

Output di esempio: Un numero casuale: 42

Usare crypto/rand per Numeri Pseudo-casuali Crittograficamente Sicuri

Per applicazioni più sensibili alla sicurezza, il pacchetto crypto/rand è adatto in quanto genera numeri casuali difficili da prevedere, rendendoli adatti per operazioni crittografiche.

package main

import (
	"crypto/rand"
	"fmt"
	"math/big"
)

func main() {
	n, _ := rand.Int(rand.Reader, big.NewInt(100))
	fmt.Println("Un numero casuale sicuro:", n)
}

Output di esempio: Un numero casuale sicuro: 81

Approfondimento

La differenza fondamentale tra i pacchetti math/rand e crypto/rand in Go deriva dalla loro fonte di entropia e dai loro casi d’uso previsti. math/rand genera numeri pseudo-casuali basati su un seme iniziale; quindi, la sequenza è deterministica e può essere prevista se il seme è noto. Ciò è adatto per scenari dove il massimo rendimento e non l’assoluta imprevedibilità è la preoccupazione principale, come le simulazioni o i giochi.

D’altra parte, crypto/rand deriva la casualità dal sistema operativo sottostante, rendendolo adatto per usi crittografici dove l’imprevedibilità è cruciale. Tuttavia, ciò comporta un costo in termini di prestazioni e complessità nel gestire i numeri che genera (come il trattamento del tipo *big.Int per gli interi).

Storicamente, la nozione di generazione di numeri casuali nei computer ha sempre danzato sul limite della vera “casualità”, con i primi sistemi che dipendevano fortemente da algoritmi deterministici che mimavano la casualità. Man mano che i computer si sono evoluti, così hanno fatto questi algoritmi, incorporando fonti di entropia più sofisticate dai loro ambienti.

Nonostante questi progressi, la ricerca della perfetta casualità nel computing è intrinsecamente paradossale, data la natura deterministica dei computer stessi. Questo è il motivo per cui, per la maggior parte delle applicazioni dove la prevedibilità sarebbe dannosa, i numeri pseudo-casuali criptograficamente sicuri da fonti come crypto/rand sono l’alternativa migliore, nonostante il loro sovraccarico.

In sostanza, l’approccio di Go con due pacchetti distinti per la generazione di numeri casuali affronta elegantemente i compromessi tra performance e sicurezza, permettendo agli sviluppatori di scegliere in base alle loro specifiche esigenze.