Я хотел бы разработать 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», и там, где найдено совпадение, рассчитать более высокий вес для этих элементов, пересчитывая веса для остальных элементов, чтобы поглотить добавление. Например:
Добавки:
- Яблоко
- Груша
- Банан
- Апельсин
- Персик
Вес
- 10%
- 10%
- 10%
- 10%
- 60 %
Но если в массиве Target содержится Pear (обратите внимание, что в идеале он будет учитывать несколько совпадений), Weights пересчитывается как:
Weights
- 5 %
- 25%
- 5%
- 5%
- 60%
Я знаю, что лучшие практики для VBA предполагает использование циклов, а не функций сопоставления с листами, однако провел некоторое исследование того, может ли это быть жизнеспособным подходом, но пока безуспешно. Я также исследовал, может ли многомерный массив быть предпочтительным подходом, но чтение показало бы, что это, вероятно, не так.