Skip to content

Instantly share code, notes, and snippets.

@mschauer
Created July 1, 2017 06:34
Show Gist options
  • Select an option

  • Save mschauer/d6a7a091bada2a828e1ac74e7baa106b to your computer and use it in GitHub Desktop.

Select an option

Save mschauer/d6a7a091bada2a828e1ac74e7baa106b to your computer and use it in GitHub Desktop.
RandFromRanges
import Base: start, next, done, length
type RandFromRangeDown
k::Int
mask::Int
end
RandFromRangeDown(k) = RandFromRangeDown(k,2^16-1)
_rnd(::RandFromRangeDown) = Base.Random.rand_ui52_raw(Base.Random.GLOBAL_RNG)
mm(n,k) = div(n,k)*k
function start(rfr::RandFromRangeDown)
d = div(rfr.mask+1,rfr.k)
rfr.k, d*rfr.k, d
end
length(rfr::RandFromRangeDown) = rfr.k-1
function next(rfr::RandFromRangeDown, state)
i, j, d = state
mask = rfr.mask
while j+i <= mask + 1
j = j + i
d = d + 1
end
x = _rnd(rfr) & mask
while x >= j
x = _rnd(rfr) & mask
end
Int(1 + x % i), (i-1, j-d,d)
end
done(rfr::RandFromRangeDown, state) = state[1] == 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment