
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の興味深いところかもしれません。
