今天公司有一个面试题是这样的:假如有一个函数rand5能等概率生成1 - 5 之间的整数,如何利用rand5来实现rand7?rand7函数的要求是能够等概率生成1 - 7之间的整数。说实话我自己也不是很清楚。 这个问题很经典的。carreercup那本书上有个常见的解法,我记得算法大概是这样的,用PHP写写吧: 这么写是什么意思呢? 两次使用rand5(),可以生成1-25的所有数。5 * (rand5() - 1) 可以生成 0 - 20,而后面的则可以生成0 - 4。用数学表达的话就是 [0, 24]。 [0, 24] 范围内生成的随机数$i如果大于21,就用 while (true) 重新生成。当$i < 21的时候,就可以用模运算了。 明白了。当 $i < 21的时候,模 7 的结果是 0-6,加1就可以修正为 1-7,这样就可以通过rand5来实现rand7了。