C++ 中的带黑名单的随机选取


假设我们有一个名为 B 的黑名单。这正在区间 [0, N) 内保留唯一整数,我们必须定义一个函数,以从 NOT in B 的范围 [0, N) 中返回一个均匀的随机整数。我们将通过减少 random() 尝试使这个函数更优化。函数调用。假设输入数组如下

为了解决这个问题,我们将遵循以下步骤 -

定义一个 map

  • 我们将使用 N 和数组 v 初始化。
  • 对于 initalize i := 0,当 i < v 的 size 时,更新(将 i 增加 1),执行 -
    • 如果 v[i] < N,则:,m[v[i]] := -1
  • M := N – m 的 size
  • n := v 的 size
  • 对于 initalize i := 0,当 i < v 的 size 时,更新(将 i 增加 1),执行 -
    • 如果 v[i] < M,则 -
      • 将 N 减少 1
      • 当 N 在 m 中时,执行 -
        • 将 N 减少 1
      • m[v[i]] := N
  • 定义一个函数 pick()
  • x := 随机数模 M
  • 返回(如果 x 存在于 m 中,则为 m[x],否则为 x)

让我们看看以下实现以获得更好的理解 -

示例

 现场演示

#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;
}

输入

Give N = 4 and array [2]

输出

1
1
0

更新于: 2020-06-02

180 次浏览

开启你的 职业生涯

完成课程即可获得认证

开始
广告