我是靠谱客的博主 大气大米,最近开发中收集的这篇文章主要介绍7 随机化算法第七章 随机化算法7.1随机数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第七章 随机化算法

7.1随机数

随机数在概率算法设计中十分重要。
计算机上无法产生真正的随机数。是一定程度上随机的,是伪随机数。
线性同余法是产生伪随机数的最常用方法。
在这里插入图片描述在这里插入图片描述

// 7-1 随机化算法
//线性同余法 
#include<iostream>
using namespace std;
int main(){
	int b,c,d; //b>=0;c>=0;d<=m
	int m=777;//m为机器大数 
	int n=10;
	int a[10];
	b=5;
	c=6;
	d=3;
	a[0]=d;
	for(int i=1;i<n;i++){
		a[i]=(b*a[i-1]+c)%m;
		cout<<a[i]<<" ";
		
	}
	return 0;
} 

在许多情况下,当算法在执行过程中面临一个选择时,随机化选择常比最优选择省事。因此随机化算法在很大程度上降低算法的复杂度。随机化算法的一个基本特征是对所求问题的同一实例用同一随机化算法求解两次可能得到完全不同的效果。不仅是结果,甚至是时间都有可能相差很大。一般情况下,将随机化算法大致分为四类:

  • 数值随机化算法
  • 蒙特卡罗算法
  • 拉斯维加斯算法
  • 舍伍德算法

数值化随机算法常用于数值问题求解。这类算法得到的往往是近似解,且近似解的精度随着计算时间的增加而不断提高。在许多情况下,要计算出问题的精确解是不可能的或没有必要的,用数值化税基算法可得到相当满意的解。

数值类问题常用,多见于MATLAB , 各种积分微分,数学计算中。

蒙特卡罗算法用于求问题的准确解。对许多问题,近似解是毫无意义的。用蒙特卡罗算法能求得问题的一个解,但这个解未必是正确的。其求得正确解的概率依赖算法所用的时间。算法所用时间越多,得到正确解的概率就越高。蒙特卡罗算法的主要缺点也在于此。一般情况下,无法有效的判断所得到的解是否可定正确。(非一般情况是可以判定的!)

设p为实数,且1/2<p<1。如果一个蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于p,则称该蒙特卡罗算法是p正确的,且称p-1/2是该算法的优势。按照这种情况,只要执行次数足够多,则可以得到正确解。不过当p小于1/2的时候就无能为力了。不过大多数蒙特卡罗算法经重复调用之后正确率快速上升。

拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时用拉斯维加斯算法会找不到解。拉斯维加斯算法找到正确解的概率会随着它所用的计算时间的增加而提高。位于所求解问题的任一实例,用同一拉斯维加斯算法反复随该实例求解足够多次,可使解失效的概率任一小。

它可以显著地改进算法的有效性,甚至对某些迄今为止找不到有效算法的问题,也能得到满意的结果。n皇后问题利用此算法可以有效的解决,算法的思路是每次放置保证不跟已经放入的起冲突即可,直到无法放入或者皇后已经放完为止。

舍伍德算法总能求得问题的一个解,而且所得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其平均情况下的计算复杂性有较大差别时,可在这个确定性算法中引入随机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例间的这种差别。舍伍德算法的精髓不是避免算法的最坏情形,而是设法消除这种最坏情形行为与特定实例之间的关联性。当出现这种情况时,在算法中增加随机性处理,只要随机性处理和当前确定性算法时间相比远低于它的时间复杂度数量级就可以。快速排序就是它的一个实例。舍伍德算法并不能改变算法的时间复杂度,但算法的时间复杂性相对均匀。

基于舍伍德算法的设计思想还可以设计高效的数据结构,跳跃表就是其中一例。具体跳跃表的实例可以从网上搜索。私下在阅读相关资料的时候,觉得跳跃表的实例应该可以在数据库的索引设计底层中出现,它是一种牺牲空间增加跳跃索引换取查询速度的,查询算法的效率可以参考快速排序,不过增加和删除的效率有点低。

最后

以上就是大气大米为你收集整理的7 随机化算法第七章 随机化算法7.1随机数的全部内容,希望文章能够帮你解决7 随机化算法第七章 随机化算法7.1随机数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部