Как может я использовать рандомизировать и rnd для получения повторяющегося списка случайных переменных?
Путем повторения списка я имею в виду, выполняете ли Вы цикл для получения 10 случайных чисел, каждое случайное число в списке будет уникально. Кроме того, если бы необходимо было выполнить эту последовательность снова, то Вы получили бы те же 10 случайных чисел как прежде.
Из уст самой Microsoft:
Чтобы повторять последовательности случайных чисел, вызывайте Rnd с отрицательным аргументом непосредственно перед использованием Randomize с числовым аргументом.
Подробности см. в здесь.
Весь раздел:
Замечания
Функция Rnd
возвращает значение меньше 1, но больше или равно нулю.
Значение числа определяет, как Rnd
генерирует случайное число:
Для любой заданной начальной затравки генерируется одна и та же последовательность чисел, поскольку каждый последующий вызов функции Rnd
использует предыдущее число в качестве затравки для следующего числа в последовательности.
Перед вызовом функции Rnd
используйте оператор Randomize
без аргумента, чтобы инициализировать генератор случайных чисел семенем, основанным на системном таймере.
Для получения случайных целых чисел в заданном диапазоне используйте следующую формулу:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
Здесь upperbound - наибольшее число в диапазоне, а lowerbound - наименьшее число в диапазоне.
Примечание Чтобы повторять последовательности случайных чисел, вызывайте Rnd с отрицательным аргументом непосредственно перед использованием Randomize
с числовым аргументом. Использование Randomize с тем же значением числа не повторяет предыдущую последовательность.
В качестве примера, если вы поместите этот код в Excel, он будет генерировать разные числа при каждом запуске:
Sub xx()
' x = Rnd(-1) '
Randomize 10
MsgBox (Rnd)
End Sub
Однако, если вы удалите строку x = Rnd(-1)
, он будет генерировать одинаковые числа при каждом запуске.
Обратите внимание, что вам нужно сделать две вещи. Вызвать Rnd
с отрицательным аргументом и вызвать Randomize
с определенным аргументом. Изменение любого из этих аргументов даст вам другое зерно (и, следовательно, последовательность).
Edit:
Re your comment:
Под повторяющейся последовательностью я подразумеваю, что если вы запустите цикл для получения 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