Повторение случайных величин в VBA

Как я могу использовать randomize и rnd для получения повторяющегося списка случайных величин?

Повторяя список, я имею в виду, если вы запустите цикл, чтобы получить 10 случайных чисел, каждое случайное число в списке будет уникальным. Кроме того, если вы снова будете запускать эту последовательность, вы получите те же 10 случайных чисел, что и раньше.

Из собственных уст 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 с определенным аргументом. Изменение любой из этих вещей даст вам другое семя (и, следовательно, последовательность).


Редактировать:

Ваш комментарий:

Повторяя последовательность, я имею в виду, если вы запустите цикл для получения 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 
  • Как скопировать листы в другую книгу с помощью vba?
  • excel VBA автоматически запускает макрос всякий раз, когда изменяется ячейка
  • Прокручивать файлы в папке с помощью VBA?
  • Это . in. Изменить, если это определено .Cells?
  • Большая функция Excel с дубликатами
  • Как сортировать коллекцию?
  • Функция IsDate возвращает неожиданные результаты
  • Как получить путь к текущему рабочему листу в VBA?
  • Подождите, пока ActiveWorkbook.RefreshAll закончит - VBA
  • Многопоточность в VBA
  • Макрос VBA падает после 32000 строк
  • Давайте будем гением компьютера.