// Deterministic shuffled list iterator using an XORSHIFT RNG // Each step is O(1), iterator is OSPACE(1) sclass WeightlessShuffledIterator extends ItIt { final L list; final int n; int i; TripletLSFR lsfr; // deterministic version *(L *list) { n = l(list); if (n == 0) ret; int bits = numberOfBitsNeededToRepresentNOptions(n+1); lsfr = new TripletLSFR(bits); } public bool hasNext() { ret i < n; } public A next() { int raw; do raw = postProcessLSFRValue(lsfr.next()-1); while (raw >= n); ret list.get(raw); }; // overridable in subclasses int postProcessLSFRValue(int i) { ret i; } }