Windows XPのアカウント画像は、数えないくじで決まっていた
Windows XPが新しいアカウントに最初の画像を割り当てる仕組みを、マイクロソフトのレイモンド・チェンがブログで明かした。起動からの時間を種に乱数を作り、枚数を数えないまま1回見て回るだけで、どの画像も同じ確率で選んでいた。
ひなた:ふぁ〜……ことね先輩。この袋のアメ、何個入っているか数えないで、いちばん公平に1個だけ選ぶ方法って、あるのですか? ……数えているうちに、なぜか減ってしまうのです。
ことね:……ひなた、それ、昨日Hacker Newsで話題になっていた問題とそっくりよ。しかも解いていたのは、25年近く前のWindows XP。アカウントを作ると、名前の横に最初から小さな絵がついていたの。チェスの絵とか、カンフーのキックの絵とか。……マイクロソフトで30年以上Windowsに関わってきたレイモンド・チェンさんが、「The Old New Thing」というブログを続けていてね。2004年に「最初の絵は、Default Picturesというフォルダの中からランダムに選ばれる」と書いていたの。そこへ去年の12月、Xで「XPが最初のプロフィール画像を決める乱数を、誰か解き明かした?」と聞く人が現れて——今週、ご本人が答えを書いたのよ。
ひかり:えっ何それっ、XPって、わたしたちが生まれる前のパソコンですよねっ!? そんな昔の絵の選び方に、300ポイント以上もついてるんですかっ!?
みずき:…22年前の「ランダムです」に、9か月前の「どうランダム?」。……聞くほうも答えるほうも、気長すぎ。で、どうだったの。
ことね:まず乱数の種は、パソコンが起動してから何ミリ秒たったか。その数で、RtlRandomExという乱数の関数を回すの。……面白いのは選び方ね。ふつうに考えたら、フォルダの絵をまず全部数えて、1から枚数までの数をひとつ引いて、もう一度頭から数え直してその番号の絵を取るでしょう? XPはそうしないの。フォルダを1回なめるだけ。1枚目を見たら、とりあえずそれを当たりにする。2枚目を見たら、2分の1の確率で当たりを入れ替える。3枚目なら3分の1、4枚目なら4分の1……。最後まで見終わったときに手元に残っている絵が、その人の絵よ。
ひかり:えっ、待って待ってっ! それ、あとから出てくる絵ほど不利じゃないですかっ!? 最後の絵なんて、ほとんど選ばれなさそうっ!
ことね:それが、ぴったり公平になるの。3枚で確かめましょう。3枚目が当たりになる確率は、そのまま3分の1。1枚目と2枚目は、2枚目を見た時点でそれぞれ2分の1。そこに、3枚目に奪われない確率の3分の2をかけると、どちらも3分の1。何枚あっても、最後は全員「枚数分の1」にそろうのよ。リザーバーサンプリングという方法の、いちばん簡単な形ね。……チェンさんが挙げる利点は2つ。ファイルを読みに行く回数が減る——遅いのはそこだから。それと、見ている途中でフォルダの中身が増えたり減ったりしても、困らない。念のため、100枚見たら打ち切る仕掛けもあるの。誰かがフォルダに100万枚入れても、おかしなことにならないように。
みずき:…名前の横の、ちっちゃい絵のために、そこまで。……で、誰得。
ことね:……それが、気にした人がいたのよ。2004年の記事の本題は、実はそっちなの。当時こんなバグ報告が来たそうでね。「XPは差別的だ。自分の名前が中国系だというだけで、名前の横にカンフーの絵を置いた。侮辱だ」。チェンさんの説明は、用意された21枚の中から、乱数がたまたまキックの絵を引いただけ。偶然を悪意のせいにしてしまう例として書いていたの。……それで今回のHacker Newsには、「なぜそんなに凝るのか。ユーザー名の頭文字を使って計算すれば十分では」というコメントも付いていたわ。
ひなた:ふぁ〜……あの。名前の頭の文字で決めていたら、その人の言ったとおり、ほんとうに名前で絵が決まってしまっていたのです。……だれの名前も見ないで選んでいたから、「たまたまです」って言えたのですね。……ひなたも、アメは袋の中を見ないで選ぶことにするのです。いちご味が出るまで。
まとめ:何枚あるかも数えず、だれの名前も見ずに1枚を選ぶ。だから22年前、「たまたまです」と言い切れた。