
2026/09/10 18:04
Windows XP が初期ユーザーの画像を選択するために使用したアルゴリズムは何ですか。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
レイモンド・チェン氏の解説によれば、Windows XP は初期ユーザー画像を「
%ALLUSERSPROFILE%\Application Data\Microsoft\User Account Pictures\Default Pictures」から選び出します。この選定は GetTickCount() の現在値を種とする RtlRandomEx を用いて行われます。ファイルシステムへの呼び出し過多によるパフォーマンスのボトルネックを回避するため、2パス方式ではなく 1 パスのレジヴォアサンプリングアルゴリズム(k=1)が採用されています:項目を順次走査する際、各項目は「当選者」として維持されるのは、1 から現在の個数までの範囲で生成された一様乱数がその現在の個数と一致する場合のみです。また、異常に多数のファイルが存在するような経路対策として、チェック対象の画像が 100 枚に達すればサンプリングを終了する追加の保護措置も設けられています。この効率的な設計により、起動時の不要なデータ処理を最小限に抑えつつ、視覚的なバリエーションを保証しています。本文
Windows XP の壁紙選択アルゴリズムと乱数生成器の解明
ある時期、Windows XP は初期設定の壁紙(プロファイル画像)をランダムに選択していました。この機能は、
%ALLUSERSPROFILE%\Application Data\Microsoft\User Account Pictures\Default Pictures ディレクトリに格納されている画像の中から決定されていました。
誰かが、その背後にある乱数生成器 (RNG) の仕組みについて解明を試みましたか?
採用された乱数生成器とシード値
- 使用関数:
RtlRandomEx - シード値:
の現在の値を使用。GetTickCount()
1 パスアルゴリズムの採用理由
システムは、全項目をカウントしてから選択する「2 パスアルゴリズム」ではなく、「1 パスアルゴリズム」を採用しています。その主な理由は以下の 2 つです。
- パフォーマンス向上
- ファイルシステムへの呼び出し回数を削減できるため、処理が高速化されます。
- 従来の naive な 2 パスアルゴリズムと比較し、ファイルシステム操作というボトルネックを回避できます。
- 実装の簡潔性と安全性
- ディレクトリ内のファイル数が実行中に変化しても、後続ステップでの矛盾を生じるリスクがありません。
- 結果として、実装上の複雑さを大幅に低減できます。
アルゴリズムの詳細と動作原理
この 1 パスアルゴリズムは、リザーブサンプリング (Reservoir Sampling) の特殊ケース (
k = 1) に相当します。これにより大幅にシンプル化された専用ロジックが可能になります。
プセウドコードによる実装例
selectRandomFromIterator(iterator) { var count = 0; var winner = null; while (iterator.moveNext()) { ++count; if (uniform_random(min: 1, max: count) == count) { winner = iterator.current(); } } return winner; }
動作の根拠
- 確率的特性: n 個の項目を持つ集合において、「最後の項目」が選ばれる確率は厳密に 1/n です。
- 帰納的プロセス:
- もし現在の項目が選ばれなくても、残りの
個の項目から再度ランダムに選択を試みます。n - 1 - このプロセスを繰り返すことで、リストが 1 項になる場合(基底ケース)に唯一の選択肢が残ることを導き出します。
- もし現在の項目が選ばれなくても、残りの
- 処理の流れ:
- リストの先頭
個の項目からランダムに 1 つを選択する。n - 1 - その際、確率 1/n で
番目の項目(最後の項目)へ切り替わる仕組みです。n
- リストの先頭
安全対策と処理制限
- ファイル数制限: サンプル対象は画像を最大 100 枚までとして処理を終了します。
- 目的: 「Default Pictures」ディレクトリに数百万のファイルが存在するなど、病理的な状況が発生してもシステムが適切に対応することを保証するためです。