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

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

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

6
задан paxdiablo 21 May 2010 в 20:35
поделиться

1 ответ

Из уст самой 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
14
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: