Random number 1..5 to 1..7


http://www.geeksforgeeks.org/generate-integer-from-1-to-7-with-equal-probability/
If we somehow generate integers from 1 to a-multiple-of-7 (like 7, 14, 21, …) with equal probability, we can use modulo division by 7 followed by adding 1 to get the numbers from 1 to 7 with equal probability.
We can generate from 1 to 21 with equal probability using the following expression.
 5*foo() + foo() -5 
Let us see how above expression can be used. 1. For each value of first foo(), there can be 5 possible combinations for values of second foo(). So, there are total 25 combinations possible. 2. The range of values returned by the above equation is 1 to 25, each integer occurring exactly once. 3. If the value of the equation comes out to be less than 22, return modulo division by 7 followed by adding 1. Else, again call the method recursively. The probability of returning each integer thus becomes 1/7.
int my_rand() // returns 1 to 7 with equal probability
{
    int i;
    i = 5*foo() + foo() - 5;
    if (i < 22)
        return i%7 + 1;
    return my_rand();
}

int rand7()
{
 int x = 22;
 while( x > 21)
  x = rand5() + 5*rand5() - 5;
 int r = 1 + (x % 7);
 return r;
}


int rand7()
{
 int x = 25;
 while( x > 21)
  x = rand5() + 5*rand5() - 5;
 
 int r = (x >> 3) + (x & 7);
 r = (r >= 7) ? r - 6 : r + 1;
 return r;
}

A dice, when you throw gives only 1,2,.....21 (since you are rejecting 22,23,24,25 a.k.a rejection sampling theorem) 
So total no. of possible are 21.
No. of ways getting "1"=3 (5*1+1-5,5*2+3-5,5*3+1-1)%7+1
No. of ways getting "2"=3 (5*1+1-5,5*2+3-5,5*3+1-1)%7+1
No. of ways getting "3"=3 (5*1+2-5,5*2+4-5,5*3+2-1)%7+1
and so on..
P(1)=3/21=1/7
P(2)=3/21=1/7 and so on...

Understand why these solutions are not right
http://www.geeksforgeeks.org/generate-integer-from-1-to-7-with-equal-probability/
x=foo()+foo()-1;
if (x !=8,9){
return x;
}

Now what's the probability here for p(1),p(2)...p(7)?
no. of ways of producing "1" =1 (1+1-1)
no. of ways of producing "2" =2 (2+1-1,1+2-1)
and so on...
Total no. of possible combination =5*5=25
P(1)=1/25;
P(2)=2/25
and so on...
So probabilities are not equal in this case !!

return (foo() + foo()%4 -1);
(foo()+foo()-1)%7+1

http://www.nerdparadise.com/tech/interview/randomness/
Imagine a 5x5 grid with numbered cells.

12345
678910
1112131415
1617181920
2122232425


You can randomly create a coordinate in this grid using x = rand5() and y = rand5(). If the cell that the random choice lands on is between 1 and 7, you can return that number. Otherwise, create new random coordinates and try again. 


function rand7():
    while true:
        x = rand5()
        y = rand5()
        if y == 1:
            return x
        if y == 2 and x <= 2:
            return 5 + x    


This is technically a correct solution to this problem. 

NOTE: It is important to stress that the 2nd if statement cannot be reduced to just y == 2 and then calling x = rand5() until x is a 1 or 2. This gives unfair probability to 6 and 7. If you do this, 1 through 5 EACH have a 1 in 25 chance of getting hit. 6 and 7 have a 1/10 chance of getting hit EACH. 

However, this solution it is not ideal. Each trial only has a 28% chance of hitting a coordinate in the desired range and a 72% chance of needing to repeat the calculation. The largest multiple of 7 below 25 is 21. So we can stretch out the ranges for each number such that it is 3 times more likely to get hit, like so...

11122
23334
44555
66677
7----


At this point it would be silly to have a bunch of if statements to determine the result. The grid is merely a visualization of the logic. The general formula looks like this:

function rand7():
    while true:
        value = (rand5() - 1) * 5 + rand5() // 1 through 25 (fair)
        if value <= 21:
            value = value - 1 // 0 through 20 (fair)
            value = floor(value / 3) // 0 through 6 (fair)
            return value + 1 // 1 through 7 (fair)
As an exercise, try creating other mappings from some rand{X}() to some rand{Y}()
http://www.growingwiththeweb.com/2014/03/given-random5-implement-random7.html
public static int random5() {
    return new Random().nextInt(5) + 1;
}

public static int random7() {
    // Get 0, 5, 10, 15 or 20 then add 0-4 (4% chance for 0-24)
    int val = (random5() - 1) * 5 + (random5() - 1);
    // If 0-20, return the result modulo 7 + 1 (12% chance for 1-7), otherwise
    // call recursively (16% chance)
    return val >= 21 ? random7() : val % 7 + 1;
}
Also refer to http://www.geeksforgeeks.org/generate-integer-from-1-to-7-with-equal-probability/
http://ariya.ofilabs.com/2007/11/random-number-1-5-to-1-7.html

题目:⽤用RAND2()去实现RAND6()
解法:
Generate a range of values where each value is equally likely (and where the range has at least 6 elements).
If we can do this, then we discard the elements greater than the previous multiple of 6 and mod the rest of them by 6.
This will give us a value within the range of 0 to 5 with each value being equally likely
int sum = -1;
while (true) {
  sum = 4 * rand.nextInt(2) + 2 * rand.nextInt(2) + rand.nextInt(2);
  if (sum <= 5) {
    break;
  }
}
return sum;

题目二:⽤用RAND5()去实现RAND7()
while(true) {
  int num = 5 * rand5() + rand5();
  if(num < 21) {
    return num % 7;
  }
}

这里可以sum=2*rand5() + rand5()吗?不可以,因为这样value wouldn't be equally distributed. For example, there would be two ways of
getting a 6 (6=2*1+4 and 6=2*2+2) but only one way of getting a 0 (0=2*0+0). The values in the range are not equally probable.
http://www.jiuzhang.com/qa/662/
  1. 有一个骰子(随机生成1-6),求用这个骰子模拟一个1-7的随机数生成器。
  2. 有一个随机生成1-5的生成器,求用这个生成器生成一个1-7的随机数生成器。
  3. 有一个随机生成器生成0和1的概率分别是p和1-p。用它模拟一个01等概率的随机数生成器。
对于问题1和2,是一样的。以1为例子,算法的核心叫做“再来一瓶”:
随机两次,结果可能有(1,1), (1,2) ... (6,6) 一共36种可能性。将他们分为8组,前7组每组5对数,最后一组就是(6,6)。如果你随机到前面7组的情况,就返回对应的组号。如果随机到(6,6),那么恭喜你,重复上述过程,再扔两次(再来一瓶)
这个题的误区是,以为用%7的方式可以解决问题,但是6和7是互质的,无论扔多少次,6的无论多少次幂都不会整除7。
对于问题3。本质也是,再来一瓶:丢两次,有四种可能性:
00 - 概率 p * p
01 - 概率 p * (1-p)
10 - 概率 (1-p) * p
11 - 概率 (1-p) * (1-p)

我们知道01和10的概率是一样的,那么如果扔到01,那么就认为是0,如果扔到10就认为是1,这样他们是等概率的。如果扔到00或者11怎么办呢?恭喜你,“再来一瓶”,重新丢两次,重复上述过程。
http://www.fgdsb.com/2015/01/03/implement-rand10-with-rand7/
要保证rand10()在整数1-10的均匀分布,可以构造一个1-10n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10n区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。由于(rand7()-1)*7+rand7()可以构造出均匀分布在1-49的随机数(原因见下面的说明),可以将41~49这样的随机数剔除掉,得到的数1-40仍然是均匀分布在1-40的,这是因为每个数都可以看成一个独立事件。
1
2
3
4
5
6
7
int rand10() {
    int x = 0;
    do {
        x = (rand7() - 1) * 7 + rand7();
    } while(x > 40);
    return x % 10 + 1;
}
Follow Up:
如何用随机函数rand5来构造随机函数rand7
也是一样,想出组合的方法。Rand5产生1到5的数,减1就产生0到4的数,乘以5后可以产生的数是:0,5,10,15,20。 再加上第二个Rand5()产生的1,2,3,4,5。我们可以得到1到25, 而且每个数都只由 一种组合得到,即上述代码可以等概率地生成1到25。组合如下:
5 * (Rand5() - 1) + Rand5()
1
2
3
4
5
6
int rand7(){
    int x = ~(1<<31); // max int
    while(x > 21)
        x = 5 * (rand5() - 1) + rand5(); // rand25
    return x % 7 + 1;
}
从上面一系列的分析可以发现,如果给你两个生成随机数的函数Randa和Randb, 你可以通过以下方式轻松构造Randab,生成1到ab的随机数:
Randab = b 
(Randa - 1) + Randb
Randab = a * (Randb - 1) + Randa
Read full article from Random number 1..5 to 1..7

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