สมมติว่าเรามีบัญชีดำที่เรียกว่า B นี่คือการเก็บจำนวนเต็มเฉพาะจากช่วง [0, N) เราต้องกำหนดฟังก์ชันเพื่อคืนค่าจำนวนเต็มสุ่มที่สม่ำเสมอจากช่วง [0, N) ซึ่งไม่อยู่ใน B เราจะพยายาม ทำให้ฟังก์ชันนี้ปรับให้เหมาะสมยิ่งขึ้นโดยการลด random() เรียกใช้ฟังก์ชัน สมมติว่าอาร์เรย์อินพุตเป็นแบบ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
กำหนดหนึ่งแผนที่
- เราจะเริ่มต้นด้วย N และอาร์เรย์ v.
- สำหรับ initalize i :=0 เมื่อ i
- ถ้า v[i]
- ถ้า v[i]
- ถ้า v[i]
- ลด N ทีละ 1
- ในขณะที่ N อยู่ในหน่วย m ให้ทำ −
- ลด N ทีละ 1
- m[v[i]] :=ไม่มี
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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