参考:https://blog.csdn.net/a19990412/article/details/78655331
- 在哪个位置设置随机数生成种子,利用什么思想?怎么设置?在哪个头文件中?
- 怎么用rand()生成0-i区间的随机数?利用了数学中的哪种运算?
- 随机向量的生成问题?
应用1
生成0~i区间内的随机数:
#include <cstdlib>
using namespace std;
rand() % (i + 1);
rand() % (i + 1) + begin; //生成begin到i之间的随机数
if(rand() % 2) // rand()%2为0或1各有50%的概率。
在软件测试中,随机向量的生成非常基本的操作
置乱算法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]);
}
}