この質問を読んだ後。O(1)空間を使用して、ダブルハッシュのようなものを使用して一様分布でシーケンス[1 ... n]のランダム順列を生成できるかどうか疑問に思いましたか?
シーケンス[1,2,3,4,5]の小さな例でこれを試しましたが、機能します。しかし、より大きなセットのスケールでは失敗します。
int h1(int k) {
return 5 - (k % 7);
}
int h2(int k) {
return (k % 3) + 1;
}
int hash(int k, int i) {
return (h1(k) + i*h2(k)) % size;
}
int main() {
for(int k = 0; k < 10; k++) {
std::cout << "k=" << k << std::endl;
for(int i = 0; i < 5; i++) {
int q = hash(k, i);
if(q < 0) q += 5;
std::cout << q;
}
std::cout << std::endl;
}
}