Generazione di numeri casuali

Rust:
Generazione di numeri casuali

Come fare:

Rust si affida a crate esterni per la generazione di numeri casuali, essendo rand il più comunemente utilizzato. Per iniziare a generare numeri casuali, dovrai prima aggiungere rand al tuo file Cargo.toml:

[dependencies]
rand = "0.8.5"

Successivamente, puoi generare numeri casuali usando rand nel tuo codice Rust. Ecco un esempio di generazione di un numero intero casuale e di un numero in virgola mobile:

use rand::{Rng, thread_rng};

fn main() {
    let mut rng = thread_rng();
    
    // Genera un numero intero casuale tra 1 e 10
    let random_int: i32 = rng.gen_range(1..=10);
    println!("Numero intero casuale: {}", random_int);
    
    // Genera un numero in virgola mobile casuale tra 0.0 e 1.0
    let random_float: f64 = rng.gen::<f64>();
    println!("Numero in virgola mobile casuale: {}", random_float);
}

Un esempio di output potrebbe essere:

Numero intero casuale: 7
Numero in virgola mobile casuale: 0.9401077112175732

Si noti che rieseguire il programma produrrà valori diversi.

Approfondimento

La generazione di numeri casuali in Rust, facilitata attraverso rand e le sue dipendenze come getrandom, rappresenta un’ampia astrazione sulle strutture del sistema operativo e sui generatori algoritmici. Storicamente, la casualità nel calcolo è evoluta da algoritmi semplici e prevedibili a metodi complessi e criptograficamente sicuri. L’approccio di Rust incapsula questa evoluzione attraverso il suo trait Rng personalizzabile, che può essere supportato da vari generatori in base alla qualità di casualità e alle prestazioni richieste.

Per la maggior parte delle applicazioni, fare affidamento su rand e sul RNG del sistema offre un buon equilibrio tra semplicità ed entropia. Tuttavia, per le applicazioni crittografiche, crate come rand si affidano a getrandom per l’inizializzazione, che a sua volta si basa su meccanismi specifici del SO (ad es., /dev/urandom sui sistemi simili a Unix), garantendo casualità criptograficamente sicura.

Alternativamente, se hai esigenze specifiche non soddisfatte da rand, esplorare altre crate o implementare generatori personalizzati basati su modelli matematici potrebbe essere una via da percorrere. Tuttavia, per la stragrande maggioranza dei casi d’uso, rand e il suo ecosistema offrono soluzioni robuste che sono sia efficienti che semplici da integrare nelle applicazioni Rust.