HN 日本語サマリー

← 一覧へ戻る
プログラミング

Windows XPは初期のユーザーピクチャをどのように選択していたか?

What algorithm did Windows XP use to choose your initial user picture? (devblogs.microsoft.com)

339 pointsby soheilpro165 コメント

要約

Windows XPが初期ユーザーピクチャをランダムに選択する際に使用したアルゴリズムについて解説しています。このアルゴリズムは、GetTickCount()をシードとしたRtlRandomEx乱数生成器と、1回のファイルシステムアクセスで済む効率的なワンパス選択アルゴリズムを採用していました。これは、k=1のレザボアサンプリングの特殊ケースであり、ファイル数の変動にも対応できる利点があります。

全文翻訳

Windows XP は初期のユーザーピクチャをどのように選択していたか?

以前、Windows XP が初期ピクチャを %ALLUSERSPROFILE%\Application Data\Microsoft\User Account Pictures\Default Pictures ディレクトリ内のピクチャからランダムに選択していたことに触れました。しかし、人々はさらに詳しく知りたいようです。

Windows XP が最初のユーザーアカウント作成時に使用するプロフィールピクチャを決定する RNG(乱数生成器)について、誰か解明を試みた人はいますか?

— Xeno (@XenoPanther) December 11, 2025

乱数生成器は、GetTickCount() の現在の値を開始シードとして使用する RtlRandomEx です。

この関数は、ワンパスのランダム選択アルゴリズムを使用しています。この決定には、すぐに思いつく2つの利点があります。第一に、すべてのアイテムを数え上げてから1からnまでの乱数をランダムに選び、次に2回目のイテレーションでそのインデックスにあるアイテムを見つけるという、単純なツーパスアルゴリズムと比較して、ファイルシステムへの呼び出し回数が削減されるため、より効率的です。ファイルシステムはボトルネックとなる場所だからです。さらに、ワンパスアルゴリズムは、コードの実行中にディレクトリ内のファイルの数が変化した場合の複雑さを回避します。

ワンパスアルゴリズムは、レザバーサンプリング の特殊なケースであり、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つだけのリストがある場合、そのアイテムを選択するしかないというベースケースから始まります。それ以外の場合、n個のアイテムのリストがある場合、まず最初の n-1 個からランダムにアイテムを選択し、次に n番目のアイテムを 1/n の確率で切り替えます。

最終的な安全チェックとして、コードは100枚のピクチャをサンプリングした後に停止します。これにより、Default Pictures ディレクトリに100万個のファイルが置かれた場合の病的な動作を回避できます。

Author

[画像: Raymond Chen]

Raymond は30年以上にわたり Windows の進化に関わってきました。2003 年に彼は "The Old New Thing" として知られるウェブサイトを開始し、それは彼の想像をはるかに超える人気を得ました。このウェブサイトは書籍にもなり、偶然にも "The Old New Thing" (Addison Wesley 2007) というタイトルでした。彼は時折、Windows Dev Docs の Twitter アカウントに登場し、有用な情報を含まない話を語ります。