Excel: тройное-случайное совпадение - пересчитать при ошибке - PullRequest
0 голосов
/ 29 августа 2018

Я разработал книгу Excel, которую я использую для сопоставления случайного отправителя со случайным получателем. Чтобы сделать это, я создал систему тройного случайного соответствия, которая, по-видимому, в большинстве случаев работает хорошо. Для первой рандомизации всем участникам назначают случайное число, а затем ранжируют (то есть с 1 по 20) на основе случайного числа. Для второй и третьей рандомизации и отправитель, и получатель выбираются с помощью случайного числа. Затем я использовал функцию VLOOKUP для создания таблицы, сопоставляя номера отправителей и получателей со списком всех участников.

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

1 Ответ

0 голосов
/ 29 августа 2018

Похоже, вам просто нужен метод для генерации двух случайных чисел от 1 до 20, которые не совпадают.

Option Explicit

Sub Macro1()
    Dim i As Long, arr As Variant

    arr = twoUnique(2, 1, 20)

    For i = LBound(arr) To UBound(arr)
        Debug.Print arr(i)
    Next i
End Sub

Function twoUnique(n As Long, s As Long, e As Long)
    Static dict As Object

    If dict Is Nothing Then Set dict = CreateObject("scripting.dictionary")
    dict.RemoveAll

    Do While dict.Count < n
        dict.Item(Application.RandBetween(s, e)) = vbNullString
    Loop

    twoUnique = dict.keys
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...