随机生成n个不相等的随机数

在计算机视觉中,(例如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进行删除操作。

posted @ 2013-07-17 23:05  ledao  阅读(2269)  评论(0编辑  收藏  举报