Ransac算法所用:C++利用rand()生成不重复的随机数以及vector数组随机重排序 以及 rand()的应用

参考:https://blog.csdn.net/a19990412/article/details/78655331

  1. 在哪个位置设置随机数生成种子,利用什么思想?怎么设置?在哪个头文件中?
  2. 怎么用rand()生成0-i区间的随机数?利用了数学中的哪种运算?
  3. 随机向量的生成问题?

应用1

生成0~i区间内的随机数:

#include <cstdlib>
using namespace std;
//rand()%i生成[0,i-1]之间的数
rand() % (i + 1);//[0,i]
rand() % (i + 1) + begin; //[0,i]+begin == [begin,i+begin]
if(rand() % 2) // [0,1]即0,1

//生成[minValue, maxValue]之间的数
//[0,maxValue-minValue] + minValue == [minValue, maxValue]
int tmp =  rand() % (maxValue - minValue + 1) + minValue;

在软件测试中,随机向量的生成非常基本的操作

置乱算法permute(),封装到向量Vector::unsort()置乱操作接口中。

应用2

 

首先要在生成随机数函数的前面设置一个种子,利用srand()函数,在头文件cstdlib中:

新建一个随机数生成类可以在类的构造函数中设置种子,增加代码的重用。

#ifndef __RANDOMNUMBER_H__
#pragma once
#define __RANDOMNUMBER_H__
#include <ctime> //time
#include <cstdlib> //rand srand
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
class RandomNumber {
public:
	RandomNumber() {
		srand(time(0));
	}

	int GetRandomNum(int begin = 0, int end = 1) {
		return rand() % (end - begin + 1) + begin;
	}
	vector<Point2f> GetRandomVector(vector<Point2f> contours)
	{
		random_shuffle(contours.begin(), contours.end());
		return contours;
	}
};

#endif

可以实现生成某范围的随机数和vector数组元素随机重排排序。

用法:

		//加入一些噪声点
		Point2f noisePoints;
		RandomNumber r, s;//提前设置种子
		for (int i = 0; i < 48; i++)
		{			
			noisePoints.x = corMidContours[i].x + r.GetRandomNum(-20, 20);
			noisePoints.y = corMidContours[i].y + s.GetRandomNum(-20, 20);
			corMidContours.push_back(noisePoints);
		}
RandomNumber r;//用类的方法设定种子
while (k < kMax)
{
    ...
    if (!RandomSelectPoints(r, corMidContours, nLeast, maybeinliers, testData))//随机获取其他样本点
		return;
    ...
}

RandomSelectPoints函数如下:

	bool CEllipse::RandomSelectPoints(RandomNumber r, vector<Point2f> contours,int nNums, vector<Point2f>& outContours, vector<Point2f>& outTestContours)
	{
		if (outContours.size() != 0)
			outContours.clear();
		if (outTestContours.size() != 0)
			outTestContours.clear();
		//random_shuffle(contours.begin(), contours.end());
		contours = r.GetRandomVector(contours);//调用vector随机不重复重排序函数

		if (nNums > contours.size())
			return false;
		for (int i = 0; i < nNums; i++)
		{
			outContours.push_back(contours[i]);
		}
		for (int i = nNums; i < contours.size(); i++)
		{
			outTestContours.push_back(contours[i]);
		}
	}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值