I’ve written a simple function to do Brownian motion on an array by producing an auxArray of transitions that are 50% 1’s and 50% -1’s. You can see from the prints of auxArray that it’s 50/50, but when I do auxArray.sample, it consistently returns twice as many -1’s as +1’s. I understand SPI is deterministic, so I run this function on various sets of data, but it consistently produces 67% -1’s. Does anyone know what’s wrong or know an alternative that will give me the 50/50 behavior I need?
define :BrownianTransition do |currIndex, vector|
# Given a vector and a current index within it, update the index in a Brownian manner and return an array
# consisting of the new index and the vector's value at that new index.
auxArray = []
vector.length.times {|idx|
auxArray[idx * 2] = -1
auxArray[(idx * 2) + 1] = 1
}
print("Brownian transition probabilities are", auxArray)
brownianMove = auxArray.sample
print("brownianMove is", brownianMove)
return([(currIndex + brownianMove), vector[(currIndex + brownianMove) % vector.length]])
end
BrownianTransition 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 2, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 3, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 4, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 5, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 6, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 7, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 8, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 2, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
BrownianTransition 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]