Windows XP 初始头像算法揭秘

What algorithm did Windows XP use to choose your initial user picture?

Windows XP 在设置初始用户头像时,并非简单地随机挑选,而是采用了一种高效的单遍随机选择算法。该算法基于 RtlRandomEx 随机数生成器,以 GetTickCount() 作为种子,属于 reservoir sampling 在 k=1 时的特例。相比传统的两遍算法,它显著减少了对文件系统的调用次数,避免了性能瓶颈,同时还能动态应对目录中文件数量变化的情况。此外,代码还设置了 100 张图片的上限,防止因目录中文件过多而导致的异常行为。这一设计细节展现了 Microsoft 工程师在资源受限环境下对效率与稳定性的极致追求。

这种单遍算法是 reservoir sampling 在 k 等于 1 时的特例,允许使用一种更简单的定制算法。
  1. mawadev

    这种情况要不是读了这类博客,我根本不会意识到。从技术上讲,我当然也能用同样的方式解决,但如今你手头总有那么多任务,根本不会去深究问题本身及其影响,这种意识和自律久而久之就被噪音淹没或被遗忘了。

    如果别人只给我 2 分钟,因为他们觉得这很简单(总是这样),那我就会统计目录下符合特定模式的文件数量,然后随机选一个索引。这种写法非常天真、快速且粗糙,完全没有采样过程,只是为了避免跟那些不想听解释的人讨论为什么耗时这么长。

    这让我想起以前大量使用 C#、Java、JS 和 Python 的日子,不停地往 map 里塞字符串和对象,直到我开始用 Zig,才意识到字符串和数据结构的分配是多么昂贵和复杂。当我们因为预算或时间限制而急于求成时,究竟浪费了多少内存和计算资源,这一点真的让我大开眼界。

  2. lyorig

    天哪,Raymond Chen 每发一篇关于 Windows 内部机制的帖子,就像过个小圣诞一样。不过我好奇的是,他在发布这些知识之前,是不是得先找人申请许可?

  3. EMIRELADERO

    对感兴趣的朋友,Chen 提到的实际代码如下:https://github.com/tongzx/nt5src/blob/daad8a087a4e75422ec96b...

  4. impoppy

    >Raymond 参与 Windows 的演进已超过 30 年。他偶尔会在 Windows Dev Docs 的 Twitter 账号上现身,讲些毫无实用价值的故事。

  5. ang_cire

    看到“递归”这个词时,我的眼睛都直了,不得不把最后几段重读几遍才能搞懂,但这真的很酷。

  6. scrumper

    这是一个很有趣的例子,展示了刚开始给计算机编程时必须进行的思维转换。对人类来说,从一堆东西里随机挑一个非常简单:你伸出手去抓,或许先在桌上搅乱一下顺序。但对计算机来说,没有直接对应的类比。它们就是做不到。而且人类的这个过程跟计算机的执行逻辑完全不像:我们不需要先数集合、遍历它们,也不需要先数物品数量再生成一个随机数来选第 n 个,更不用担心选中空值。

  7. cgio

    人们愿意多花一个脑细胞,只为避免数十亿次的二次遍历。

  8. iJohnDoe

    很有意思的话题。

    我曾给一位姓亚洲姓氏的人配置账号,系统选中的是“幸运饼干”头像。

    可能不是玄学,但看起来也绝非 100% 随机。更像是某种关联匹配在起作用。

同日更多故事

2026-09-10