Вычислить весовой массив из совпадений между двумя другими массивами - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы разработать For l oop, чтобы выполнить вычисление для массива, включающего результаты сопоставления между двумя существующими массивами. Мой текущий код:

Sub WeightedRand()

Dim Adjuncts() As Variant
rng1 = Worksheets("Look-ups").Range("C2:C33")
Adjuncts() = rng1
Max = UBound(Adjuncts)

Dim Target() As Variant
rng2 = Range("D20:D25")
Target() = rng2

'This is the loop which will need to be modified
ReDim Weights(Max) As Double
Weights(32) = 0.99
For i = Max - 1 To 1 Step -1
    Weights(i) = ((1 - Weights(32)) / Max)
Next i

Dim j As Long, sum As Double
    Dim spin As Double
    Randomize
    spin = Rnd()
    For j = LBound(Weights) To UBound(Weights)
        sum = sum + Weights(j)
        If spin <= sum Then
            adj = Adjuncts(j)
            Exit For
        End If
    Next j

MsgBox adj

End Sub

, который принимает массив, заполняет его содержимым диапазона ячеек, вычисляет удельный вес c для последнего элемента и равномерно распределяет весовые коэффициенты по всем остальным, а затем выбирает случайный элемент на основе этого веса. То, что я хотел бы сделать, это сравнить элементы в «Adjuncts» с теми, что в «Target», и там, где найдено совпадение, рассчитать более высокий вес для этих элементов, пересчитывая веса для остальных элементов, чтобы поглотить добавление. Например:

Добавки:

  1. Яблоко
  2. Груша
  3. Банан
  4. Апельсин
  5. Персик

Вес

  1. 10%
  2. 10%
  3. 10%
  4. 10%
  5. 60 %

Но если в массиве Target содержится Pear (обратите внимание, что в идеале он будет учитывать несколько совпадений), Weights пересчитывается как:

Weights

  1. 5 %
  2. 25%
  3. 5%
  4. 5%
  5. 60%

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

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