Sorry, didn't see your other comments coming in :)

I'll look into using `np.random.choice` in place of the existing algorithms. I'd like to get this merged first, though, and update the algorithms in a different PR. Sampling without replacement is ~1000x slower than multinomial, so it already needs some looking into.