解説
AIの確認例を毎回変えていない?乱数のseedと抽出したIDを残して比べよう
PythonのRandomとsampleで同じ評価例を抽出し直す練習。seedだけでなく元の一覧・順序・バージョンと選ばれたIDを残す理由を整理。

AIへの依頼文をA案とB案で比べたのに、試した入力まで毎回違っていた。結果の差が依頼文の違いなのか、問題の違いなのか分かりにくくなるよ。
このページでは、確認に使う例をランダムに選び、同じ条件で取り出し直す方法を紹介する。Python 3.12と架空の問題IDだけで試せるので、AIの実行や有料APIは必要ないよ。依頼文の調整用と最終確認用を分ける話に加え、今回は抽出した例の記録に焦点を当てる。
seedは、擬似乱数の開始条件
擬似乱数は、決められた計算で作る乱数の列。seedは、その開始条件に使う値だよ。同じ開始条件から、同じ手順で計算することで、比較用の抽出を再現しやすくなる。
ただし「seedが同じなら、どんな環境でも何もかも同じ」とは考えないでね。元の候補一覧、並び順、呼び出した処理、Pythonの版なども関係する。
小さな一覧から三件を選ぶ
from random import Random
population = ['Q01', 'Q02', 'Q03', 'Q04', 'Q05', 'Q06']
ids = sorted(population)
if len(set(ids)) != len(ids):
raise ValueError('problem IDs must be unique')
selected = Random(42).sample(ids, k=3)
again = Random(42).sample(ids, k=3)
print(selected)
print(selected == again)
print(population)
Random(42)で専用の生成器を作り、sampleで三件を選ぶ。元のpopulationは変更しないよ。Python 3.12での編集部の検証では、選択結果はQ06・Q01・Q05、二回の一致はTrueになった。
sampleは、このような一意のID一覧なら同じIDを二度選ばない抽出に使える。ただし、元の一覧に同じ値が複数あれば、それぞれの出現位置が選ばれる候補になる。そのため、今回は先にIDの重複を拒否している。
同じ生成器を続けて使う場合との違い
次の例は、毎回開始条件へ戻しているわけではないよ。
rng = Random(42)
first = rng.sample(ids, k=3)
second = rng.sample(ids, k=3)
print(first == second)
生成器の状態は、一回目の抽出で先へ進む。この例の二回の結果は同じではない。比較の途中に別の乱数処理を加えると、後の選択にも影響することがある。
最初の例が二回とも新しいRandom(42)を作っている理由は、同じ開始条件へ戻すためなんだ。
seedと一緒に、選ばれたIDも保存する
確認記録には、少なくとも次を残そう。
| 記録するもの | 確認したいこと |
|---|---|
| 元の資料の版と候補ID一覧 | 同じ集合から選んだか |
| 抽出前の順序、件数、seed | 抽出の条件が同じか |
| Pythonの版と抽出コード | 実行条件が変わっていないか |
| 最後に選ばれたID一覧 | 実際に何を試したか |
Python公式は、randomの多くのアルゴリズムが版をまたいで変わり得ると説明している。sampleの結果を将来もseedだけで保証するのではなく、選択済みIDを記録しておくと、対象を確実に固定できるよ。
比較条件をそろえても、代表性は別
同じ三問で比較できることと、その三問で利用全体を評価できることは別。少数のランダム抽出で、重要な分類や失敗条件が必ず入るとは限らない。分類別の必要件数や境界の例は、目的に合わせて別に計画しよう。
また、ここで固定しているのは評価に使う入力。AIサービスの回答が同じになることを保証する設定ではないよ。
編集部では2026年10月29日にPython公式資料を確認し、本文の抽出結果、元一覧の保持、同じ生成器の状態変化と重複IDの拒否を検証した。AIの回答精度や実サービスの再現性は測っていないよ。調整用と最終確認用の例、評価用の境界ケースも参考になるね。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。