Повторение случайных величин в VBA - PullRequest
6 голосов
/ 21 мая 2010

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

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

1 Ответ

13 голосов
/ 21 мая 2010

Из собственных уст 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...