Contenuto principale

Creazione di array di numeri casuali

MATLAB® utilizza gli algoritmi per generare numeri pseudo-casuali e pseudo-indipendenti. Questi numeri non sono rigorosamente casuali e indipendenti nel senso matematico, ma superano diversi test statistici di casualità e indipendenza e il loro calcolo può essere ripetuto a fini di test o diagnostica.

Le funzioni rand, randi, randn e randperm sono le funzioni principali per creare array di numeri casuali. La funzione rng consente di controllare il seme e l'algoritmo che genera i numeri casuali.

Funzioni di numeri casuali

Esistono quattro funzioni fondamentali per i numeri casuali: rand, randi, randn e randperm. La funzione rand restituisce numeri in virgola mobile compresi tra 0 e 1 estratti da una distribuzione uniforme. Ad esempio, creare un vettore colonna di 1000x1 contenente numeri reali in virgola mobile estratti da una distribuzione uniforme.

rng("default")
r1 = rand(1000,1);
Tutti i valori in r1 sono compresi nell'intervallo aperto (0,1). Un istogramma di questi valori è pressoché piatto, indicando un campionamento abbastanza uniforme dei numeri.

La funzione randi restituisce valori interi double estratti da una distribuzione discreta uniforme. Ad esempio, creare un vettore colonna di 1000x1 contenente valori interi estratti da una distribuzione discreta uniforme.

r2 = randi(10,1000,1);
Tutti i valori in r2 sono compresi nell'intervallo chiuso [1, 10]. Un istogramma di questi valori è pressoché piatto, indicando un campionamento abbastanza uniforme dei numeri interi compresi tra 1 e 10.

La funzione randn restituisce array di numeri reali in virgola mobile estratti da una distribuzione normale standard. Ad esempio, creare un vettore colonna di 1000x1 contenente numeri estratti da una distribuzione normale standard.

r3 = randn(1000,1);
Un istogramma di r3 si presenta come una distribuzione pressoché normale, con media pari a 0 e deviazione standard pari a 1.

È possibile utilizzare la funzione randperm per creare un array double di valori interi casuali senza valori ripetuti. Ad esempio, creare un array 1x5 contenente numeri interi scelti casualmente dall'intervallo [1, 15].

r4 = randperm(15,5);
A differenza di randi, che può restituire un array contenente valori ripetuti, l'array restituito da randperm non ha valori ripetuti.

Chiamate successive a una qualsiasi di queste funzioni restituiscono risultati diversi. Questo comportamento è utile per creare diversi array di valori casuali.

Generatori di numeri casuali

MATLAB offre diverse opzioni di algoritmi di generazione, riepilogati nella tabella sottostante.

ValoreNome del generatoreParola chiave del generatore
"twister"Mersenne Twistermt19937ar
"simdTwister"Mersenne Twister rapido orientato ai SIMDdsfmt19937
"combRecursive"Ricorsivo multiplo combinatomrg32k3a
"multFibonacci"Fibonacci moltiplicativo ritardatomlfg6331_64
"philox"Generatore Philox 4x32 con 10 roundphilox4x32_10
"threefry"Generatore Threefry 4x64 con 20 roundthreefry4x64_20
"v4"Generatore legacy della versione MATLAB 4.0mcg16807
"v5uniform"Generatore uniforme legacy della versione MATLAB 5.0swb2712
"v5normal"Generatore normale legacy della versione MATLAB 5.0shr3cong

Utilizzare la funzione rng per impostare il seme e il generatore utilizzati dalle funzioni rand, randi, randn e randperm.

Ad esempio, rng(0,"twister") imposta il seme su 0 e l'algoritmo del generatore su Mersenne Twister. Per evitare la ripetizione degli array di numeri casuali quando MATLAB si riavvia, vedere Why Do Random Numbers Repeat After Startup?

Per ulteriori informazioni su come controllare lo stato del generatore di numeri casuali per ripetere i calcoli utilizzando gli stessi numeri casuali o per garantire che vengano utilizzati numeri casuali diversi nei calcoli ripetuti, vedere Controlling Random Number Generation.

È possibile impostare l'algoritmo e il seme predefiniti nelle impostazioni di MATLAB (da R2023b). Se non si modificano queste impostazioni, rng utilizza il valore di fabbrica di "twister" per il generatore Mersenne Twister con seme 0, come nelle release precedenti. Per maggiori informazioni, vedere Default Settings for Random Number Generator e Reproducibility for Random Number Generator.

Tipi di dati di numeri casuali

Per impostazione predefinita, le funzioni rand e randn generano valori in doppia precisione.

rng("default")
A = rand(1,5);
class(A)
ans = 'double'

Per specificare esplicitamente la classe come doppia:

rng("default")
B = rand(1,5,"double");
class(B)
ans = 'double'
isequal(A,B)
ans = 
1

rand e randn possono anche generare valori in singola precisione.

rng("default")
A = rand(1,5,"single");
class(A)
ans = 'single'

I valori sono gli stessi di quelli che si otterrebbero convertendo in doppia precisione i valori dell’esempio precedente. Il flusso di numeri casuali da cui attingono le funzioni avanza allo stesso modo, indipendentemente dalla classe di valori restituita.

A,B
A =
    0.8147    0.9058    0.1270    0.9134    0.6324


B =
    0.8147    0.9058    0.1270    0.9134    0.6324

randi supporta sia i tipi interi che quelli a singola o doppia precisione.

A = randi([1 10],1,5,"double");
class(A)
ans = 'double'
B = randi([1 10],1,5,"uint8");
class(B)
ans = 'uint8'

Vedi anche

| | | |

Argomenti