You can always choose not to reject again if some number of rejections fail. With a sufficiently large random number range, the chances of rejection at any step can be made tiny, and the possibility of successive rejections drops exponentially with the number of rejections allowed until you have a theoretical probability smaller than the probability of hardware bit errors on the platform itself. If this happens, you can either throw once more and use that result, with a tiny amount of modulo bias, or you can just throw an exception.