Estuve prácticando hacer un algoritmo sencillo para generar números aletorios porque ya saben el de Visual Studio tiene muchos errores no me gusta :silbar:
El principal problema es la semilla que siempre usamos, datos que cambian constantemente como los Ticks del sistema o la hora, pero lamentablemente los procesadores de hoy en día trabajan tan rápido que en un milisegundo se producen miles de números "aletorios" con la misma semilla, y obtenemos horribles patrones o muchos números repetidos.
La función obtiene una cantidad Count de valores entre Min y Max de números pseudoaleatorios.
Public Function RandomEx(ByVal Min As Long, ByVal Max As Long, Optional ByVal Count As ULong = 1) As Long()
RandomEx = New Long() {}
Dim Seed As Long = Date.Now.Ticks
Do While RandomEx.Length <> Count
Array.Resize(RandomEx, RandomEx.Length + 1)
RandomEx.SetValue((Seed Mod (Max + 1)) + Min, RandomEx.Length - 1)
Seed -= Math.Floor(Seed / (Count + 1))
Loop
End Function
Básicamente esto se encarga de colocar a Seed entre Min y Max
(Seed Mod (Max + 1)) + Min
Y esto de mantener a Seed diferente en cada vuelta del búcle, la fórmula asegura que Seed siempre será diferente sin causar Overflow.
Seed -= Math.Floor(Seed / (Count + 1))