Open2

Python標準ライブラリrandomのsample関数

かっぱんかっぱん

境界値の確認やcountsが設定されている場合などを除くと、populationの大きさが

21 + 4 ^ {\lceil \log_4(3k) \rceil}

より大きいか小さいかで処理方法を変えていそう。

小さいときは、 populationのコピーを作ってpopulationの大きさの乱数を生成させて選択し、選ばれたもののところに一番最後の要素を入れて乱数の範囲を狭めてを繰り返している。
大きいときは、選択済みsetを用意しておいて、そこに入っていない乱数が得られるまで乱数を取得することを繰り返している。(面白いのはルックアップテーブルを見に行く時間を削減しパフォーマンスを上げるためかselected.addを変数にいれている)

となると、この閾値は何を根拠に決めているのかということになりそう