Random numbers without repetitions

The random object outputs a pseudo-randomly chosen integer. The range of possible numbers is determined by the number received in the right inlet (or specified as a typed-in argument). Each time random receives a bang, it will output one of n possible numbers, ranging from 0 to n-1. Because each number has an equal probability of occurring each time, there’s a possibility that repetitions will occur. If you wish to prevent repetitions there are two approaches.

Instead of random, you can use the urn object, which employs an algorithm that excludes all previously-chosen numbers. Once urn has chosen all possible numbers, if it receives a bang but has no more possible numbers to output, it sends a notifying bang out its right outlet. You can reset urn with a clear message, so that it once again starts choosing from all its possibilities. When you reset it, there's of course the possibility that the first new choice could be the same as the last choice prior to the reset, so if you absolutely want no immediate repeats, you need to test the output and choose again if there's a repeat.

To prevent immediate repetitions, you can store the output of random in a variable (such as int) each time it comes out, and then treat that as the previous number, for comparison with the next output. If the two are the same, you suppress the output and try again (provided you have a minimum of 2 possible random choices, of course).

You can use that same method to prevent repetitions when you reset an urn object, although it’s redundant the rest of the time, since urn already avoids repetitions.

Here’s a little nerdy detail. With the method shown on the left, using the random object, each number always has an equal likelihood of being chosen each time, except for the previous number which has no likelihood of being chosen. Whereas, with the urn object shown on the right, each number that has been chosen since the last reset has a zero likelihood of being chosen, and the remaining unchosen numbers have an increasing likelihood of being chosen.