This got me thinking about how randomness is implemented:
__attribute__ ( ( always_inline ) ) __STATIC_INLINE int32_t rand_s32(void) {
// This function differs from the standard C rand() definition, standard C
// rand() only returns positive numbers, while rand_s32() returns the full
// signed 32 bit range.
// The hardware random generator can't provide new data as quick as desireable
// but rather than waiting for a new true random number,
// we multiply/add the seed with the latest hardware-generated number.
static uint32_t randSeed = 22222;
return randSeed = (randSeed * 196314165) + RNG->DR;
}
(from axoloti_math.h)
So just glancing at this rand/uniform by itself isn't giving any uniqueness guarantee, just that the results are uniformly distributed. RNG->DR is based on reading physical analog noise; off the top of my head I'm not sure what they guarantee about it statistically.
Like Jaffa is saying, you need more logic if you want to have something spit out unique values and then reset, conceptually like a lottery system where you are pulling tickets out, like you pick n values, put them in a bucket and pull them out until the bucket is empty and then reset.