与拉斯维加斯算法不同,蒙特卡罗算法可能会偶然地产生不正确的答案。假定解某个问题的蒙特卡罗算法,对该问题的任何实例得到正确解的概率为p,并且有1/2<p<1,则称该蒙特卡罗算法是p正确的,该算法的优势为p-1/2;如果对同一个实例,该蒙特卡罗算法不会给出两个不同的正确答案,就称该算法是一致的,第一个一致的p正确的蒙特卡罗算法,如果重复第运行,每一次运行都独立地进行随机的选择,就可以使产生不正确答案的概率变得任意小。
用蒙特卡罗算法求数组主元素,随机地选择一个元素进行测试,如果它是主元素,就返回true,否则返回false,然后再对这个算法进行进一步的处理。
#include<iostream> #include<cstdlib> #include<cmath> #include<ctime> using namespace std; /* 求数组主元素 输入:n个元素的数组A[] 输出:数组A的主元素 算法检测不出主元素的错误概率小于E */ bool majority(int a[],int &x,int n,double e) { int t,s,i,j,k; bool flag=false; srand(time(NULL)); s=log(1/e); for(t=1;t<=s;t++) { i=rand()%n; //i [0,n-1] k=0; for(j=0;j<n;j++) if(a[i]==a[j]) k++; if(k>n/2) { x=a[i]; flag=true; break; } } return flag; } int main() { int n; cout<<"请输入数组大小"; cin>>n; int *a=new int[n]; cout<<"请输入数组各元素"<<endl; for(int i=0;i<n;i++) { int tmp=rand()%4; a[i]=tmp; } for(int i=0;i<n;i++) cout<<a[i]<<ends; cout<<endl; double e; cout<<"请输入检测不出主元素的错误概率e"; cin>>e; int x; if(majority(a,x,n,e)) cout<<"主元素为 "<<x; else cout<<"找不到主元素"; }