Custom Randomize | Generate Integers with Equal Probability

Problem

Given a function foo(), that returns an integer between 1 and 5 (inclusive) with equal probability. Write a function using foo() that returns an integer between 1 and 7 (inclusive) with equal probability.

Solution

Randomize() 
  return 5*foo() + foo() - 5

Approach 1

Now, Randomize() generates integers 1 to 25 with equal probability ie. 1/25 (each). So our solution is:
return N, only if N >= 1 && N < 8

Randomize1()
  N = 5*foo() + foo() - 5
  if N >= 1 && N < 8:
    return N

Approach 2

Since, Randomize() generates integers 1 to 25 with equal probability ie. 1/25 (each). So our solution is:
(N%7) + 1, only if N < 22,
otherwise 2, 3, 4 and 5 will have more probability (4/7 each).

Randomize2()
  N = 5*foo() + foo() - 5
  if N < 22:
    return (N%7) + 1

Code Implementation

//
//  main.cpp
//  Custom Randomize
//
//  Created by Himanshu on 27/11/22.
//

#include <iostream>
using namespace std;

int randomize() {
    int x = rand()%5 + 1;
    return x;
}

int customRandomize() {
    int N = 5*randomize() + randomize() - 5;
    
    while (N > 7) {
        N = 5*randomize() + randomize() - 5;
    }
    
    return N;
}

//This method is slightly more efficient
int customRandomize2 () {
    int N = 5*randomize() + randomize() - 5;
    
    while (N > 21) {
        N = 5*randomize() + randomize() - 5;
    }
    
    return ((N%7) + 1);
}

int main () {
    
    int x, y;
    
    cout<<"Randomly generated integers between 1 and 7:"<<endl;
    for (int i=0; i<5; i++) {
        x = customRandomize();
        cout<<x<<endl;
        y = customRandomize2();
        cout<<y<<endl;
    }
    
    return 0;
}

Output

Randomly generated integers between 1 and 7:
5
4
2
6
1
4
6
3
7
2

Here’s a working example: Custom Randomize

Leave a Reply

Your email address will not be published. Required fields are marked *