对数器

当我们想出一个复杂度低算法时,如何对算法的准确性进行判断呢?使用对数器
方法:

  1. 你想要测试的方法a
  2. 觉得正确不考虑复杂度的算法b
  3. 产出随机样本
  4. 用b和a对样本进行处理
  5. 比对处理结果
  6. 反复进行3~5 当样本足够多时 可以认为正确

产生随机数的方法

  1. 使用rand函数配合srand
  2. 使用random库函数

说下第二种
头文件 < random >

	static default_random_engine e(time(NULL));//产生随机数的引擎
	static uniform_int_distribution <int> dis(1,40);//产生随机数,1~40是声明的范围
	//int是指定声明类型

使用: 用uniform_int_distribution函数调用default_random_engine引擎范围值为设定的类型
如上 dis(e)返回值为int类型

注意:

  • 随机数引擎e中的time(NULL)和srand中的作用一样为了产生不一样的种子数
  • 如果是在一个调用的函数中反复使用以上方法来产生随机数,因加上static时其成为全局变量不然产生的随机数可能会一样。分析:若不设为全局变量,在栈中开辟空间,每次调用函数时创建随机数引擎,函数结束时释放,若反复调用函数,且系统允许速度足够快时,新建立的随机数引擎可能会和上次销毁的一样,随机数可以相同。这个问题在使用rand和srand来产生随机数时同样可能出现

使用举例:用归并法找数组中的最大数用对数器验证

#define _CRT_SECURE_NO_WARNINGS 2

//作者:蒋伟泉
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
using namespace std;
int Maxnum(vector<int>&obj,int left,int right){//归并法
	if (left == right)
		return obj[left];
	int mid = (left + right) / 2;
	int left_max = Maxnum(obj, left, mid);
	int right_max = Maxnum(obj, mid+1, right);
	return left_max > right_max ? left_max : right_max;
}
int Max_right(vector<int>&obj, int left, int right){//确保正确的方法
	int max = obj[left];
	for (int i = left + 1; i <= right; i++){
		if (obj[i] > max)
			max = obj[i];
	}
	return max;
}
void test(){
	static default_random_engine e(time(NULL));
	static uniform_int_distribution <int> dis(0,40);//随机数范围
	int time = 5000;//测试次数 自己设定
	int size = 0;//数组大小
	int i = 0;
	int j = 0;
	for (i = 0; i < time; i++){
		size = dis(e)+1;//随机数范围设为 0 ~ 40 加1保证数组不为空
		vector<int>obj;
		for (j = 0; j < size; j++){
			obj.push_back(dis(e));
		}
		if (Max_right(obj, 0, obj.size() - 1) != Maxnum(obj, 0, obj.size() - 1)){
		//判断结果不一样则直接退出 
			cout << "wrong" << endl;
			break;
		}
	}
	cout << "right" << endl;
}
int main()
{
	test();
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值