ImaginaryHuman, something like
I did a little test to see how much faster it is, and it's not a massive amount:
Function picksomethingbinary(probabilities#[],sumprobabilities#[]) l=Len(probabilities) p#=Rnd(0,1) i=l/2 move=i While 1 move:/2 If move=0 Then move=1 s#=sumprobabilities[i] If s<p i:+move ElseIf s-probabilities[i]>p i:-move Else Return i EndIf Wend Return i - 1 End Function
I did a little test to see how much faster it is, and it's not a massive amount:
Local probabilities#[5] probabilities=[.1,.1,.1,.2,.5] Local sumprobabilities#[5] t#=0 For i=0 To 4 t:+probabilities[i] sumprobabilities[i]=t Next ms=MilliSecs() For i=1 To 100000 number=picksomethingbinary(probabilities,sumprobabilities) Next diff=MilliSecs()-ms Print "binary search method took "+String(diff)+"ms" ms=MilliSecs() For i=1 To 100000 number=picksomething(probabilities) Next diff=MilliSecs()-ms Print "lazy method took "+String(diff)+"ms"