Is there a way in .NET to generate a sequence of all the 32-bit integers (Int32
) in random order, without repetitions, and in a memory-efficient manner? Memory-efficient would mean using a maximum of just a few hundred mega bytes of main memory.
Ideally the sequence should be something like an IEnumerable<int>
, and it lazily returns the next number in sequence, only when requested.
I did some quick research and I found some partial solutions to this:
- Using a maximal linear feedback shift register - if I understood correctly, it only generates the numbers in increasing sequence and it does not cover the entire range
- Using the Fisher-Yates or other shuffling algorithms over collections - this would violate the memory restrictions given the large range
- Maintaining a set-like collection and keep generating a random integer (perhaps using
Random
) until it doesn't repeat, i.e. it's not in the set - apart from possibly failing to satisfy the memory requirements, it would get ridiculously slow when generating the last numbers in the sequence. - Random permutations over 32 bits, however I can't think of a way to ensure non-repeatability.
Is there another way to look at this problem - perhaps taking advantage of the fixed range of values - that would give a solution satisfying the memory requirements? Maybe the .NET class libraries come with something useful?
Aucun commentaire:
Enregistrer un commentaire