趣题:用两枚硬币随机生成 1 到 n 之间的整数 | Matrix67: The Aha Moments


趣题:用两枚硬币随机生成 1 到 n 之间的整数 | Matrix67: The Aha Moments
为了随机地并且概率均等地生成一个 1 到 6 之间的整数,通常的做法就是抛掷一个正方体的骰子。不过,这并不是唯一的办法。如果你有一枚公正的、正反概率相同的硬币,以及一枚不公正的、正反概率之比为 1 : 2 的硬币,那么你也能概率均等地生成一个 1 到 6 之间的整数。首先抛掷那枚不公正的硬币,那么结果有 1/3 的概率是正面朝上,有 2/3 的概率是反面朝上。如果出现了正面朝上的情况,那么令 i = 1 ;如果出现了反面朝上的情况,那么就再抛掷那枚公正的硬币,掷出正面则令 i = 2 ,掷出反面则令 i = 3 。最后,再抛掷一次公正的硬币,如果正面朝上则令 j = 0 ,如果反面朝上则令 j = 3 。容易看出, i + j 的值有 1, 2, 3, 4, 5, 6 这六种可能,它们出现的概率是均等的,都是 1/6 。
有人或许会说,用硬币模拟骰子哪有那么复杂,只用一枚公正的硬币就能办到:连续抛掷三次硬币,并且规定掷出"正正正"代表数字 1 ,掷出"正正反"代表数字 2 ,"正反正"为 3 ,"正反反"为 4 ,"反正正"为 5 ,"反正反"为 6 ,掷出"反反正"和"反反反"则重来,这不就行了吗?不过,这种方法有一个局限性:它不能保证整个过程在有限步之内完成。而我们刚才的方法中,总的步骤数有一个上限:三步之内必然完成。
我们的问题是:是否对于所有的正整数 n ,都能找到两枚合适的硬币,使得借助它们便能在有限步之内概率均等地产生一个 1 到 n 之间的整数?

答案是肯定的。接下来,我们将会构造性地证明,不管 n 是多少,我们总能使用正反出现概率分别为 1:1 和 1:(n-1) 的两枚硬币,在有限的步数内达成目的。不妨先以 n = 11 时的做法为例,来说明我们的大致思路。
当 n = 11 时,首先把 1:1 的那枚硬币连续抛掷五次,这会出现 32 种等概率的正反组合,然后抛掷 1:10 的那枚硬币,出现正面和出现反面的概率分别为 1/11 和 10/11 。
抛完这六次硬币后,一共会产生 64 种不同的情况,其中 32 种情况出现的概率都是 (1/32) × (1/11) = 1/352 ,另外 32 种情况出现的概率则都是 (1/32) × (10/11) = 10/352 。我们可以在一个单位正方形里直观地表示出这 64 种情况:先用一系列横线把整个正方形划分成 32 个等宽横条,再在左起 1/11 的地方画一条竖线,把每个横条都分成 1:10 两份。图中的这 64 个区域就对应着可能出现的 64 种情况,每个区域的面积占整个正方形的多少,就表示与之对应的情况出现的概率是多少。我们可以把整个正方形看作是由 32 × 11 = 352 个小格子组成的,那么每个格子的面积都占整个正方形的 1/352 ,左边每个区域都只包含 1 个格子,右边每个区域则都包含 10 个格子。
如果我们能把某些区域指派给数字 1 ,把另一些区域指派给数字 2 ,等等,最后把剩下的区域指派给 11 ,使得分给每个数字的区域都包含 32 个格子,即都占正方形总面积的 1/11 的话,问题就解决了。在上面这个图中,这件事情是可以办到的。每 2 个左边的区域和 3 个右边的区域加在一起,正好组成 32 个格子。这样推算下去,划分出 1, 2, 3, …, 10 的地盘,就会用掉左边的 20 个区域和右边的 30 个区域。最后,左边还剩下 12 个区域,右边还剩下 2 个区域,正好又组成了 32 个格子,它们正好成了 11 的地盘。像刚才所说的那样完成六次抛掷后,看看出现的情况位于哪个数的地盘里,便能等概率地产生 1 到 11 之间的整数了。
同样的思路可以适用于任意正整数 n 。取一枚公平的硬币并连续抛掷 k 次,再抛掷一枚正反概率为 1:(n-1) 的硬币,整个概率空间就被分成了 2k × 2 个区域,左边每个区域都占 1 小格,右边每个区域都占 n-1 小格,所有区域加在一起一共有 2k · n 个小格。我们的目标便是把这些区域重新组合成 n 份,使得每份正好都是 2k 个小格。令 q 等于 2k 除以 n-1 的商,令 r 等于 2k除以 n-1 的余数,那么每次选择 q 个右边的区域和 r 个左边的区域相搭配,正好就是 2k 小格,可供 1 到 n 中的其中一个数使用。如果 q = r ,那么右边的区域和左边的区域会同时用完,于是大功告成。如果 q > r ,那么右边的区域会率先出现不够用的局面,不过这没有关系:右边的每一个区域都可以等效地用左边的 n-1 个区域来代替,因而不够的话总是能从左边找补回来的。如果 q < r 的话,这就真的不好办了,不过幸运的是,我们还留有一手:我们可以精心选择 k 的值,来避免 q < r 。
比方说,刚才 n = 11 时,我们选择的 k 值为 5 ,此时 2k 除以 n-1 的商 q = 3 ,余数 r = 2 。对于其他的正整数 n ,我们总能选择一个合适的 k ,使得 2k 除以 n-1 的商和余数满足 q ≥ r 吗?是的。我们至少可以这么做:注意到余数 r 始终小于除数 n-1 ,因此我们只需要让商数 q 至少是 n-1 即可;因而,选取足够大的 k ,使得 2k ≥ (n-1)2 ,便能保证 q ≥ r 了。
Read full article from 趣题:用两枚硬币随机生成 1 到 n 之间的整数 | Matrix67: The Aha Moments

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts