专栏首页计算机视觉lifeOpenCV学习入门(四):RNG 伪随机问题

OpenCV学习入门(四):RNG 伪随机问题

在我的上一篇博客《OpenCV学习入门(三):kmeans原理及代码 》中调试kmeans时发现一个问题:每次运行时,以下两行代码

int clusterCount = rng.uniform(2, MAX_CLUSTERS + 1);		
int sampleCount = rng.uniform(1, 1001);

生成的两个变量结果是一样的!于是我就研究了一下随机类RNG,最终找到了问题的原因。

在解释原因之前先了解一下伪随机数,百度里面对计算机产生随机数的过程有详细解释,看不懂也没关系,关于伪随机数记住下面一句话即可:

计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。

注意到程序中有如下一行代码

RNG rng(12345); //随机数产生器

OpenCV里RNG类构造函数初始化为固定的值后随机种子也是固定的,所以在相同的平台环境下,编译后每次运行它,显示的随机数是一样的。 我们来做一个小测试:

#include "stdafx.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <ctime>
#define n 5
using 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 5
using namespace cv;
using namespace std;
int main()
{
	RNG rng((unsigned)time(NULL)); // initialize with the system time
	cout << "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 条评论
登录 后参与评论

相关文章

  • Git diffmerge 工具的配置及问题解决

    最近使用git时发现git diff 不方便,尤其是代码改动较大的时候,需要分成很多行,通过空格翻页对比,用户体验极差

    用户1150922
  • 计算机视觉方向简介(四) | 深度相机室内实时稠密三维重建

    室内场景的稠密三维重建目前是一个非常热的研究领域,其目的是使用消费级相机(本文特指深度相机)对室内场景进行扫描,自动生成一个精确完整的三维模型,这里所说的室内可...

    用户1150922
  • 计算机视觉方向简介 | 图像拼接

    作者戴金艳,公众号:计算机视觉life, 编辑部成员.首发原文链接计算机视觉方向简介 | 图像拼接

    用户1150922
  • 吴恩达最近在干嘛?“我老婆说我是失业者中,工作最努力的”

    舒石 假装发自 硅谷 量子位 报道 | 公众号 QbitAI 3月22日宣布从百度离职后,吴恩达一度在网络上销声匿迹。 以前这位人工智能大牛一天可能发好几条推特...

    量子位
  • 吴恩达注册人工智能风投基金AI Fund:三大项目之二?

    机器之心报道 机器之心编辑部 8 月 8 日,吴恩达宣布深度学习课程 Deeplearning.ai 项目正式发布。在机器之心对吴恩达的专访中也获知,这只是他未...

    机器之心
  • 入门 | 吴恩达Deeplearning.ai 全部课程学习心得分享

    机器之心
  • 入门 | 吴恩达Deeplearning.ai 全部课程学习心得分享

    ? 作者 Ryan Shrott 本文作者,加拿大国家银行首席分析师 Ryan Shrott 完成了迄今为止(2017 年 10 月 25 日)吴恩达在 ...

    CDA数据分析师
  • 将深度学习专门化: 吴恩达的21节Deeplearning.ai课程学习经验总结

    截止到2017年10月25日,吴恩达在Coursera上目前有3门新的深度学习课程: 1.神经网络和深度学习(Neural Networks and Deep...

    AiTechYun
  • Excel实战技巧56: 快速交换所选的两个单元格区域中的值

    有时候,我们需要将两个单元格区域中的数据对换,也就是说,第一个区域的数据放置到第二个区域,而第二个区域的数据放置到第一个区域。

    fanjy
  • Flutter环境问题:Requested 'libusbmuxd >= 1.1.0' but version of libusbmuxd is 1.0.10

    最近有同学反应不能为flutter正确配置iOS开发环境,当执行brew install --HEAD libimobiledevice时会遇到一个问题:

    JarvanMo

扫码关注云+社区

领取腾讯云代金券