在计算机视觉中,(例如8点算法)经常用到RANSAC算法在N个数据中找到最合适的一组n(n<N)个数据对,使某项指标达到最大。解决这个问题需要随机的在N个数据对中采样。本文实现一种线性的,复杂度为O(n)的方法完成这个功能。
原理很简单,将N个随机数对排列,只要得到n个不相等的下标,就可以得到n个随机数对。
下面就是获取下标的程序:
#include <iostream> #include <vector> #include <time.h> using namespace std; using namespace std; vector<int> get_random(int n, int N) { vector<int> vec(N); vector<int> out_vec; for(int i=0;i<N;++i) { vec[i]=i; } for (int i=0;i<n;++i) { int rand_value=rand()%N; out_vec.push_back(vec[rand_value]); vec[rand_value]=vec[N-1]; N--; } return out_vec; } int main() { srand((unsigned int)time(0)); vector<int> randsample=get_random(8,100); for (size_t i=0;i<randsample.size();++i) { cout<<randsample[i]<<endl; } }
获得n个下标之后,就能方便的索引到N个排列好的数据对,我们的问题就解决了。
该方法的优点在于:1 不需要排斥重复的随机数。2 不需要对vector进行删除操作。