OpenCV学习入门(四):RNG 伪随机问题
来源:互联网 发布:eval json 编辑:程序博客网 时间:2024/05/20 06:28
在我的上一篇博客《OpenCV学习入门(三):kmeans原理及代码 》中调试kmeans时发现一个问题:每次运行时,以下两行代码
int clusterCount = rng.uniform(2, MAX_CLUSTERS + 1);int sampleCount = rng.uniform(1, 1001);
生成的两个变量结果是一样的!于是我就研究了一下随机类RNG,最终找到了问题的原因。
在解释原因之前先了解一下伪随机数,百度里面对计算机产生随机数的过程有详细解释,看不懂也没关系,关于伪随机数记住下面一句话即可:
计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。
注意到程序中有如下一行代码
我们来做一个小测试:
构造函数rng初始化为12345,程序运行后,每次生成的“随机数”都一样,如下图1:
图1:rng(12345)结果
图2:rng(1234)结果
图3:rng(123)结果
解决办法就是利用系统时间初始化一个随机种子,具体代码如下:
编译后连续运行3次的结果如下图4:
图4 rng((unsigned)time(NULL))
RNG rng(12345); //随机数产生器OpenCV里RNG类构造函数初始化为固定的值后随机种子也是固定的,所以在相同的平台环境下,编译后每次运行它,显示的随机数是一样的。
我们来做一个小测试:
#include "stdafx.h"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <ctime>#define n 5using namespace cv;using namespace std;int main(){RNG rng(12345);cout << "Generate 5 random numbers within [1,1000)" << endl;for (int i = 0; i < n; ++i){cout << rng.uniform(1, 1000) << endl;}}
构造函数rng初始化为12345,程序运行后,每次生成的“随机数”都一样,如下图1:
图1:rng(12345)结果
更改构造函数rng初始化为1234,每次运行生成的“随机数”仍然都一样,如下图2:
图2:rng(1234)结果
继续更改构造函数rng初始化为123,每次运行生成的“随机数”仍然都一样,如下图3:
图3:rng(123)结果
好吧,看来确实如我所料的,RNG类构造函数初始化为固定的值后随机种子也是固定的,那怎样才能不需要更改初始化值,同样的代码,同样的编译环境,每次生成的结果都是随机的呢?
#include "stdafx.h"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <ctime>#define n 5using namespace cv;using namespace std;int main(){RNG rng((unsigned)time(NULL)); // initialize with the system timecout << "Generate 5 random numbers within [1,1000)" << endl;for (int i = 0; i < n; ++i){cout << rng.uniform(1, 1000) << endl;}}
编译后连续运行3次的结果如下图4:
图4 rng((unsigned)time(NULL))
到此,相同的程序每次运行生成的才是我们要的随机数。
0 0
- OpenCV学习入门(四):RNG 伪随机问题
- OpenCV之随机类RNG
- OpenCV学习笔记(十二)——随机数产生器RNG
- OpenCV学习笔记(十二)——随机数产生器RNG
- opencv RNG
- opencv中RNG产生随机数问题
- OpenCV学习(十一)之随机数生成器RNG
- opencv学习日常之随机数发生器RNG
- opencv学习笔记-种子随机数产生器RNG
- OpenCV学习笔记(3):点集的最小外接矩形/圆,RNG类
- RNG随机类
- 学习OpenCV(四)
- OpenCV学习笔记——随机数产生器RNG
- 伪随机解决真随机问题
- opencv函数之RNG
- Opencv中RNG
- opencv随机数发生器RNG
- OpenCV 随机数生成器 RNG
- 判断游戏胜者-Who Is the Winner
- C++二叉查找树实现过程详解
- 行编辑命令的实现。
- linux中grep的使用
- (10.1.3.2)浅谈扁平化设计—– keep it simple
- OpenCV学习入门(四):RNG 伪随机问题
- 1028. 人口普查(20)
- const char*, char const*, char*const的区别与记忆
- python os与sys函数
- 老鸟给新手的指示
- 新手误区
- Java语法基础之比较
- 新手烦恼
- 最近做的事情和关注的技术