Windows XPのユーザー画像選択アルゴリズムが意外と賢かった話

Wait 5 sec.

Windows XPを初めてセットアップしたとき、ユーザーアカウントには自動でアイコン画像が割り当てられます。実はこの画像、単なるランダム選択ではなく、効率性と安全性を考えた専用アルゴリズムで選ばれていたことが、MicrosoftのベテランエンジニアRaymond Chen氏の解説からわかりました。使われていたランダム生成の仕組みWindows XPがアイコン画像を探すために参照しているのは、%ALLUSERSPROFILE%\Application Data\Microsoft\User Account Pictures\Default Picturesで指定される標準画像フォルダです。乱数生成にはRtlRandomExが、初期シードにはGetTickCount()が使われ、起動時間に応じて毎回異なる乱数が生成される仕組みでした。画像を選択するアルゴリズムとしてはファイル一覧を2回読み込むような、素直ではあるものの非効率な方法は採用していません。代わりに使われていたのが「リザーバサンプリング(k=1)」と呼ばれる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;}これは、フォルダ内の画像を1つずつ読みながら、「今まで見た数に応じて確率的に勝者を入れ替えていく」という方式で、最終的に1枚が選ばれます。この方法には次のメリットがあります。ファイルシステムへのアクセス回数が少なくて済む→ XP時代のPCでは特に重要な最適化処理中にフォルダ内のファイル数が変わっても破綻しない→ 2回読み込み方式だと途中で数が変わると不整合が起きるもし誰かがフォルダに大量の画像を入れていた場合、処理が終わらなくなる可能性があります。そのためXPは、100枚を上限として走査を打ち切る安全策を入れていました。当時のWindowsらしい、堅実で実用的な設計です。まとめ:XPらしい地味だけど賢い最適化Windows XPの初期ユーザー画像選択は、単なるランダムではなく、効率性・安全性・実用性を兼ね備えたアルゴリズムで実装されていました。普段は気にしないような細部にも工夫が詰まっているのがXPの興味深いところかもしれません。