I think that's technically impossible, because even generating a single uniformly-distributed random number in a range of arbitrary size has unbounded worst-case time.
If you can accept a small difference from the correct probabilities, then it becomes possible.
Start with all the numbers, then repeatedly: take a random one, remove it, and move the last one into its place (so that they remain contiguous).
To avoid the O(n) initialization, there are several options (the best option depends on how you'll be using this):