Contenuto principale

Creazione di array di numeri casuali

R2026b

MATLAB® utilizza algoritmi deterministici per generare numeri pseudo-casuali. Questi numeri non sono veramente casuali e indipendenti nel senso matematico, ma superano i test statistici di casualità e indipendenza ed è possibile riprodurre la sequenza di numeri casuali a fini di verifica 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.

Generazione di numeri casuali

È possibile utilizzare le funzioni rand, randi, randn e randperm per generare numeri casuali che seguono diversi tipi di distribuzioni. La funzione rand genera numeri casuali in virgola mobile compresi tra 0 e 1 estratti da una distribuzione uniforme. Ad esempio, creare un vettore colonna di 10.000x1 contenente numeri reali in virgola mobile estratti da una distribuzione uniforme.

rng("default")
n = 10000;
r1 = rand(n,1);
Tutti i valori in r1 sono compresi nell'intervallo aperto (0,1). Tracciare un istogramma di questi valori. L'istogramma è sostanzialmente piatto, il che indica che il campione di valori segue una distribuzione uniforme.
histogram(r1)
xlabel("Value")
ylabel("Counts")
title("Histogram of rand(" + n + ",1)")

La funzione randi genera valori interi casuali double estratti da una distribuzione discreta uniforme. Ad esempio, creare un vettore colonna di 10.000x1 contenente valori interi nell'intervallo chiuso [1,10] estratti da una distribuzione uniforme discreta.

n = 10000;
r2 = randi(10,n,1);
Tracciare un istogramma di questi valori. L'istogramma è sostanzialmente piatto, il che indica che il campione di numeri interi compresi tra 1 e 10 segue una distribuzione uniforme.
histogram(r2)
xlabel("Value")
ylabel("Counts")
title("Histogram of randi(10," + n + ",1)")

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

n = 20000;
r3 = randn(n,1);
Tracciare un istogramma di questi valori. L'istogramma presenta una forma gaussiana, il che indica che il campione di valori segue una distribuzione normale standard, con media pari a 0 e deviazione standard pari a 1.
histogram(r3)
xlabel("Value")
ylabel("Counts")
title("Histogram of randn(" + n + ",1)")

La funzione randperm genera un array double di numeri interi casuali senza valori ripetuti. Ad esempio, creare un array 1x10 contenente numeri interi scelti casualmente dall'intervallo [1,15].

r4 = randperm(15,10);
A differenza di randi, che può restituire un array contenente valori ripetuti, randperm restituisce un array senza valori ripetuti. Tracciare un istogramma di questi valori. Ogni numero intero compare al massimo una volta nell'istogramma.
histogram(r4)
xticks(1:15)
xlim([0 16])
yticks([0 1])
xlabel("Value")
ylabel("Counts")
title("Histogram of randperm(15,10)")

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

Specifica del seme e del generatore di numeri casuali

È possibile utilizzare la funzione rng per impostare il seme e l'algoritmo del generatore utilizzati dalle funzioni rand, randi, randn e randperm. Il seme definisce lo stato iniziale di un generatore di numeri casuali e consente di riprodurre una sequenza di numeri casuali. L'algoritmo del generatore determina l'algoritmo utilizzato per generare una sequenza di numeri casuali.

MATLAB fornisce gli algoritmi del generatore riportati in questa tabella.

NomeDescrizione
"twister" (predefinita)Mersenne Twister
"combRecursive"Generatore ricorsivo multiplo combinato
"multFibonacci"Generatore di Fibonacci moltiplicativo ritardato

"pcg" (da R2026b)

Generatore congruenziale permutato a 64 bit con moltiplicazione a doppio XOR-shift
"philox"Generatore Philox 4x32 con 10 round
"simdTwister"Mersenne Twister rapido orientato al SIMD
"threefry"Generatore Threefry 4x64 con 20 round

"xoshiro" (da R2026b)

Generatore XOR-shift-rotate con stato a 256 bit e doppia addizione

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 in modo da poter ripetere i calcoli utilizzando gli stessi numeri casuali o per garantire che vengano utilizzati numeri casuali diversi nei calcoli ripetuti, vedere Control Random Number Generation.

È possibile modificare il seme e l'algoritmo predefiniti del generatore di numeri casuali nella finestra MATLAB Settings (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. Per maggiori informazioni, vedere Default Settings for Random Number Generator e Reproducibility for Random Number Generator.

Specifica del tipo di dato per i numeri casuali

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

rng("default")
A = rand(1,5)
A = 1×5
    0.8147    0.9058    0.1270    0.9134    0.6324

È inoltre possibile specificare esplicitamente il tipo di dato per i numeri casuali. Ad esempio, specificare il tipo di dato come double.

rng("default")
B = rand(1,5,"double")
B = 1×5
    0.8147    0.9058    0.1270    0.9134    0.6324
tf = isequal(A,B)
ans =
  logical
   1

rand e randn possono anche generare valori in singola precisione.

rng("default")
A_single = rand(1,5,"single")
A_single = 1×5 single row vector
    0.8147    0.9058    0.1270    0.9134    0.6324

I valori sono gli stessi di quelli che si otterrebbero convertendo i valori a doppia precisione dell'esempio precedente in valori a singola precisione. Il flusso di numeri casuali da cui attinge la funzione rand avanza allo stesso modo, indipendentemente dal tipo di dato dell'output.

B_single = cast(B,"single");
isequal(A_single,B_single)
ans =
  logical
   1

La funzione randi supporta i tipi a singola e doppia precisione nonché tutti i numeri interi, tranne int64 e uint64.

A = randi([1 10],1,5,"double")
A = 1×5
    1    3    6    10    10
B_uint8 = randi([1 10],1,5,"uint8")
B_uint8 = 1×5 uint8 row vector
    2    10    10    5    9

Vedi anche

| | | |

Argomenti