// 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() { ++i; int raw; do { /*if (lsfr.cycleComplete()) fail("Internal error");*/ raw = postProcessLSFRValue(lsfr.next()-1); } while (raw >= n); ret list.get(raw); }; int bits() { ret lsfr == null ? 0 : lsfr.n; } // overridable in subclasses int postProcessLSFRValue(int i) { ret i; } }