Skip to main content

Class Random

La classe Random és la forma moderna i preferida en VB.NET (i en tot l'entorn .NET) per generar nombres pseudoaleatoris. Ofereix més flexibilitat i control que la funció heretada Rnd().

La classe Random pertany a l'espai de noms System i actua com a generador de nombres que semblen aleatoris (d'aquí el terme "pseudoaleatori"). Aquests nombres es generen mitjançant un algoritme matemàtic que comença amb un valor inicial anomenat llavor o seed.

El punt més important és: per obtenir una bona distribució d'aleatorietat, heu d'instanciar la classe Random només una vegada a nivell de classe o mòdul.

Inicialització (Seed)

Quan instancies la classe Random, aquesta s'inicialitza amb una llavor (seed):

Inicialització Descripció
New Random() (Recomanada) El generador s'inicialitza amb una llavor basada en l'hora actual del sistema. Això garanteix que la seqüència de nombres serà diferent cada vegada que s'iniciï l'aplicació.
New Random(llavor) El generador s'inicialitza amb una llavor numèrica específica (Integer). Si s'utilitza la mateixa llavor, la seqüència de nombres serà sempre idèntica, la qual cosa pot ser útil per a tests repetibles o per recrear un estat de joc.

Exemple: Inicialització segura

Fragmento de código
' Declarar una instància compartida (Shared) a nivell de classe/mòdul
' per garantir que s'utilitza la mateixa llavor durant tota l'execució.
Private Shared RndGen As New Random()

Public Sub AplicacioIniciada()
    ' RndGen ja està inicialitzat de forma única
    Console.WriteLine("Generador aleatori llest.")
End Sub

Mètodes

La classe Random no té propietats importants, però els seus mètodes, basats en el mètode Next(), són la seva funcionalitat principal:

Mètode Tipus de Retorn Rang Generat Ús Principal
Next() Integer De $0$ fins a $2.147.483.647$ (màxim de Integer). Quan només es vol un gran nombre aleatori positiu.
Next(maxValue) Integer De $0$ (inclòs) fins a maxValue (exclòs). Generar un índex aleatori d'una llista (de $0$ a List.Count - 1).
Next(minValue, maxValue) Integer De minValue (inclòs) fins a maxValue (exclòs). Generar nombres aleatoris dins d'un rang específic (p. ex., llançament de dau).
NextDouble() Double De $0.0$ (inclòs) fins a $1.0$ (exclòs). Càlculs de probabilitat o percentatges.
NextBytes(buffer) (Cap) Omple una matriu de bytes (buffer) amb una seqüència de nombres aleatoris. Criptografia, generació de dades binàries aleatòries.

Exemple: Generar un nombre enter en un rang

Volem simular el llançament d'un dau de 20 cares (valors de l'1 al 20, ambdós inclosos). El mètode Next(min, max) exclou el valor màxim, així que hem de demanar fins a 21 per incloure el 20.

Fragmento de código
Public Sub LlançarDau()
    ' Genera un nombre sencer aleatori entre 1 i 20
    Dim resultat As Integer = RndGen.Next(1, 21) 
    
    Console.WriteLine("El resultat del dau és: " & resultat.ToString())
End Sub

Exemple: Utilitzar probabilitats amb NextDouble()

Volem saber si un atac en un joc té un 65% de probabilitat d'èxit.

Fragmento de código
Public Sub ComprovarProbabilitat()
    ' NextDouble genera un nombre entre 0.0 i 0.999...
    Dim probabilitat As Double = RndGen.NextDouble()
    
    If probabilitat < 0.65 Then ' Si el valor està entre 0.0 i 0.6499... (65% d'èxit)
        Console.WriteLine("ATAC EXITÓS! (" & probabilitat.ToString("P") & ")")
    Else
        Console.WriteLine("FALLA. (" & probabilitat.ToString("P") & ")")
    End If
End Sub

Exemple: Seleccionar un element aleatori d'una llista

La classe Random és perfecta per seleccionar un element aleatori d'una col·lecció. Utilitzem Next(maxValue) on maxValue és el nombre d'elements.

Fragmento de código
' Suposem que tenim una llista de noms
Private LlistaDeNoms As New List(Of String) From {"Joan", "Marta", "Pere", "Anna"}

Public Function EscollirGuanyador() As String
    
    ' 1. Obtenir el nombre màxim d'índexs possibles (0 a Llista.Count - 1)
    Dim numElements As Integer = LlistaDeNoms.Count
    
    ' 2. Generar un índex aleatori (de 0 fins a (Count - 1))
    Dim indexAleatori As Integer = RndGen.Next(numElements) 
    
    ' 3. Retornar l'element d'aquest índex
    Return LlistaDeNoms(indexAleatori)
    
End Function

Aquests exemples mostren com la classe Random ofereix una manera potent i neta de generar aleatorietat per a qualsevol funció de joc o simulació.