to implement rand7() by rand5()
主要思路是构造一个解空间映射$$A$$到另一个解空间$$B$$,就这个题目而言需要注意的是从$$A$$中值映射到$$B$$中值的数量应该是相等的。
按照上面思路:
构造一个$$5\times 5 $$的矩阵循环填充 3 遍 1-7,共计 21 个取值空间其余以 0 补齐,如果返回值为 0,在来一次。
| 12
 3
 4
 5
 6
 
 | int val = 0;result[5 * 5] = [1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0];
 while (val == 0) {
 val = result[rand5() * rand5()];
 }
 rerurn val;
 
 | 
改良一下,其实这是需要 21 个解,即为 7 的倍数,如何靠 rand5() 的运算构造出就可以了。
考虑一下 rand5() 最大是 5,最小是 1,则$$rand5() \times rand5() = [1, 25]$$, 然后取$$[1, 21]$$重新映射到$$[1, 7]$$。
demo:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | import random
 
 def rand5():
 return random.randint(1, 5)
 
 
 
 
 
 
 def rand7():
 while (True):
 i = 5 * (rand5() - 1) + rand5()
 if 21 >= i:
 break
 return i % 7 + 1
 
 
 if __name__ == "__main__":
 try:
 state = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0}
 while (True):
 state[rand7()] += 1
 except KeyboardInterrupt:
 print state
 exit
 
 |