Из собственных уст Microsoft:
Чтобы повторить последовательности случайных чисел, вызовите Rnd с отрицательным аргументом непосредственно перед использованием Randomize с числовым аргументом.
Подробнее см. здесь .
Весь раздел:
Примечания
Функция Rnd
возвращает значение меньше 1, но больше или равно нулю.
Значение числа определяет, как Rnd
генерирует случайное число:
Для любого заданного начального начального числа генерируется та же последовательность номеров, поскольку каждый последующий вызов функции Rnd
использует предыдущий номер в качестве начального числа для следующего числа в последовательности.
Перед вызовом Rnd
используйте оператор Randomize
без аргумента, чтобы инициализировать генератор случайных чисел начальным числом, основанным на системном таймере.
Чтобы получить случайные целые числа в заданном диапазоне, используйте следующую формулу:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
Здесь верхняя граница - это наибольшее число в диапазоне, а нижняя - это самое низкое число в диапазоне.
Примечание Чтобы повторить последовательности случайных чисел, вызовите Rnd с отрицательным аргументом непосредственно перед использованием Randomize
с числовым аргументом. Использование Randomize с тем же значением для номера не повторяет предыдущую последовательность.
Например, если вы поместите этот код в Excel, он будет генерировать другое число при каждом запуске:
Sub xx()
' x = Rnd(-1) '
Randomize 10
MsgBox (Rnd)
End Sub
Однако, если вы раскомментируете строку x = Rnd(-1)
, она генерирует одинаковое число при каждом запуске.
Обратите внимание, что вы должны сделать две вещи. Вызовите Rnd
с отрицательным аргументом и вызовите Randomize
с конкретным аргументом. Изменение любой из этих вещей даст вам другое семя (и, следовательно, последовательность).
Edit:
Ваш комментарий:
Повторяя последовательность, я имею в виду, если вы запустите цикл, чтобы получить 10 случайных чисел, каждое случайное число в списке будет уникальным. Кроме того, если вы снова запустите эту последовательность, вы получите те же 10 случайных чисел, что и раньше. Имеет ли смысл то, что я описываю?
Теперь вам нужна еще одна информация. То, что вы просите, это не случайные числа, а алгоритм тасования. Я отсылаю вас к более раннему ответу, который я дал о том, как это сделать здесь . Все, что вам нужно сделать, это объединить алгоритм перемешивания с настройкой начального числа, описанной выше, и вы получите свою повторяемую уникальную последовательность.
А вот код, который показывает это в действии. Каждый прогон этой подпрограммы возвращает последовательность 4 1 5 6 2 3 7 10 9 8
, так что я думаю, что это то, что вы были, повторяемая, «случайная», уникальная последовательность. Если вы хотите иметь возможность генерировать разные последовательности (но все еще повторяемым образом), вам нужно всего лишь изменить значение, данное на 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