Меня интересует скорость, а не красивый код, поэтому я использую массив, а не список (целого числа).
У меня есть массив, похожий на: 0,1,0,1,1,0,1,0,1,1,1,0,0,1
Меня интересует положение каждого числа, поэтому я могу потом выбрать случайное.
Итак, я делаю цикл по массиву, чтобы получить номер позиции каждого 1, а затем создаю новый массив, похожий на этот: 2,4,5,7,9,10,11,14
это может быть побитовое здесь? Понятия не имею
код выглядит так:
Private Function theThing() As Integer()
Dim x As Integer
'arIn() would be a parameter
Dim arIn() As Integer = {0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1}
Dim ar() As Integer = Nothing
Dim arCount As Integer = -1
For x = 1 To arIn.GetUpperBound(0)
If arIn(x) = 1 Then
arCount += 1
End If
Next
If arCount > -1 Then
'using redim preseve is slower than the loop above
ReDim ar(arCount)
arCount = 0
For x = 1 To arIn.GetUpperBound(0)
If arIn(x) = 1 Then
ar(arCount) = x
arCount += 1
End If
Next
End If
Return ar
End Function
* РЕДАКТИРОВАТЬ *
текущее решение (на 10-15% быстрее) теперь
Private Function theThing() As Integer
Dim ar() As Integer = {0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1}
Dim arLenght As Integer = ar.GetUpperBound(0)
Dim arCount As Integer = 0
Dim x As Integer
For x = 1 To arLenght
If ar(x) = 1 Then
ar(arCount) = x
arCount += 1
End If
Next
dim r As New Random()
Return ar(r.Next(arCount))
End Function
Я не думаю, что его можно оптимизировать больше, если только кто-то не найдет способ сделать именно то, что делает решение, но гораздо быстрее
До этого вопроса я мог делать около 25500 пробежек каждые 10 секунд.
Теперь он может работать более 32250 раз, увеличение на 21%, спасибо!