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
' 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.
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.
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.
' 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ó.