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.
Código
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
Código:
(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.
Código:
Seed -= Math.Floor(Seed / (Count + 1))