HN 日本語サマリー

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

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

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

111 pointsby soheilpro45 コメント

要約

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

全文翻訳

しばらく前に、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個のアイテムからランダムにアイテムを選択し、次に1/nの確率でn番目のアイテムに切り替えます。 最終的な安全チェックとして、コードは100枚のピクチャをサンプリングした後に停止します。これにより、誰かがDefault Picturesディレクトリに100万個のファイルを置いた場合の病的な動作が回避されます。 September 8, 2026 Windows 95のwinstart.batファイルのサンプル使用法 Raymond Chen August 25, 2026 Windows Entertainment Packは、MS-DOSバージョンをエミュレータ内で実行するだけではなぜダメだったのか? Raymond Chen