Repetición de variables aleatorias en VBA

¿Cómo puedo usar randomize y rnd para obtener una lista repetitiva de variables aleatorias?

Al repetir la lista, quiero decir que si ejecuta un ciclo para obtener 10 números aleatorios, cada número aleatorio de la lista será único. Además, si tuviera que ejecutar esta secuencia nuevamente, obtendría los mismos 10 números aleatorios que antes.

De la propia boca de Microsoft:

Para repetir secuencias de números aleatorios, llame a Rnd con un argumento negativo inmediatamente antes de usar Aleatorizar con un argumento numérico.

Mira aquí para más detalles.

Toda la sección:


Observaciones

La función Rnd devuelve un valor menor que 1 pero mayor o igual que cero.

El valor del número determina cómo Rnd genera un número aleatorio:

Para cualquier semilla inicial dada, se genera la misma secuencia numérica porque cada llamada sucesiva a la función Rnd usa el número anterior como una semilla para el próximo número de la secuencia.

Antes de llamar a Rnd , utilice la instrucción Randomize sin un argumento para inicializar el generador de números aleatorios con una semilla basada en el temporizador del sistema.

Para producir enteros aleatorios en un rango dado, use esta fórmula:

 Int((upperbound - lowerbound + 1) * Rnd + lowerbound) 

Aquí, el límite superior es el número más alto en el rango, y el límite inferior es el número más bajo en el rango.

Nota Para repetir secuencias de números aleatorios, llame a Rnd con un argumento negativo inmediatamente antes de usar Randomize con un argumento numérico. El uso de Aleatorización con el mismo valor para el número no repite la secuencia anterior.


A modo de ejemplo, si coloca este código en Excel, genera un número diferente cada vez que lo ejecuta:

 Sub xx() ' x = Rnd(-1) ' Randomize 10 MsgBox (Rnd) End Sub 

Sin embargo, si descomenta la línea x = Rnd(-1) , genera el mismo número en cada ejecución.

Tenga en cuenta que debe hacer dos cosas. Llame a Rnd con un argumento negativo y llame al Randomize con un argumento específico. Cambiar cualquiera de esas cosas te dará una semilla diferente (y por lo tanto una secuencia).


Editar:

Re su comentario:

Al repetir la secuencia, quiero decir que si ejecuta un ciclo para obtener 10 números aleatorios, cada número aleatorio de la lista será único. Además, si tuviera que ejecutar esta secuencia nuevamente, obtendría los mismos 10 números aleatorios que antes. ¿Tiene sentido lo que estoy describiendo?

Ahora necesita una información más. Lo que estás pidiendo no son números aleatorios, sino un algoritmo de mezcla. Te referiré a una respuesta anterior que di sobre cómo hacer esto aquí . Todo lo que necesita hacer es combinar el algoritmo de mezcla con la configuración de inicialización detallada anteriormente y tendrá su secuencia repetible y única.


Y aquí hay un código que lo muestra en acción. Cada ejecución de esta subrutina devuelve la secuencia 4 1 5 6 2 3 7 10 9 8 así que creo que eso es lo que buscabas, una secuencia repetible, “aleatoria” y única. Si desea poder generar secuencias diferentes (pero aún de manera repetible), solo necesita cambiar el valor asignado a Randomize .

 Option Explicit Option Base 1 Sub xx() Dim x(10) As Integer Dim xc As Integer Dim xp As Integer Dim i As Integer Dim s As String For i = 1 To 10 x(i) = i Next xc = 10 i = Rnd(-1) Randomize 1 s = "Values:" For i = 1 To 10 xp = Int(Rnd * xc) + 1 s = s & " " & CStr(x(xp)) x(xp) = x(xc) xc = xc - 1 Next i MsgBox (s) End Sub