
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Random Pick with Blacklist in C++
Suppose we have a blacklist called B. This is holing unique integers from range [0, N), we have to define a function to return a uniform random integer from range [0, N) which is NOT in B. We will try to make this function more optimized by reducing random(). function call. Suppose the input array is like
To solve this, we will follow these steps −
Define one map
- We will initialize with N and array v.
- for initalize i := 0, when i < size of v, update (increase i by 1), do −
- if v[i] < N, then:, m[v[i]] := -1
- M := N – size of m
- n := size of v
- for initialize i := 0, when i < size of v, update (increase i by 1), do −
- if v[i] < M, then −
- decrease N by 1
- while N is in m, do −
- decrease N by 1
- m[v[i]] := N
- if v[i] < M, then −
- Define a function pick()
- x := random number mod M
- return (if x is present in m, then m[x], otherwise x)
Let us see the following implementation to get better understanding −
Example
#include <bits/stdc++.h> using namespace std; class Solution { public: int M; map <int,int> m; Solution(int N, vector<int>& v) { for(int i = 0; i < v.size(); i++){ if(v[i] < N) m[v[i]] = -1; } M = N - (int)(m.size()); int n = v.size(); for(int i = 0; i < v.size(); i++){ if(v[i] < M){ while(m.count(--N)); m[v[i]] = N; } } } int pick() { int x = rand() % M; return m.count(x)? m[x] : x; } }; main(){ vector<int> v = {2}; Solution ob(4,v); cout << (ob.pick()) << endl; cout << (ob.pick()) << endl; cout << (ob.pick()) << endl; }
Input
Give N = 4 and array [2]
Output
1 1 0
Advertisements