Windows XP 怎么随机挑你的默认头像?答案是一趟水塘抽样
来源:devblogs.microsoft.com — devblogs.microsoft.com · 263 分 · by soheilpro
📋 概述
Raymond Chen 回答了一个被追问多年的细节:Windows XP 首次创建账户时,会从 Default Pictures 目录里随机挑一张作为头像,随机源是以 GetTickCount() 为初始种子的 RtlRandomEx。算法是「一趟式」随机选择:遍历文件时维护计数,若 uniform_random(1, count) 恰好等于 count,就把当前项选为胜者——这是 k=1 的水塘抽样特例。相比先数总数、再抽一个索引、再遍历第二遍找该项的两趟做法,它减少了文件系统调用,也避免了遍历途中目录内容变化带来的麻烦;原理是第 n 项有 1/n 概率成为最终答案。作为安全阀,采样最多进行 100 张图片,防止有人说目录里塞了一百万个文件。
🔑 核心要点
- 随机源是RtlRandomEx,种子取 GetTickCount()。
- 采用的是一趟式随机选择,即k=1 的水塘抽样特例。
- 一趟法既减少文件系统调用,也避免遍历中目录变化的竞态。
- 数学依据是第 n 项有 1/n 的概率中选。
- 最多只采样100 张图片,防止目录异常膨胀。
💡 金句
第 n 个元素有 1/n 的概率中选——把递归展开,你就得到这个只有五行的一趟算法。
👍 0
👎 0
← 返回 Hacker News 首页