版块导航
正在加载中...
客户端APP下载
论文辅导
申博辅导
登录
注册
帖子
帖子
用户
本版
应《网络安全法》要求,自2017年10月1日起,未进行实名认证将不得使用互联网跟帖服务。为保障您的帐号能够正常使用,请尽快对帐号进行手机号验证,感谢您的理解与支持!
24小时热门版块排行榜
>
论坛更新日志
(821)
>
虫友互识
(94)
>
休闲灌水
(48)
>
导师招生
(29)
>
基金申请
(29)
>
硕博家园
(27)
>
论文投稿
(24)
>
考博
(23)
>
公派出国
(20)
>
论文道贺祈福
(13)
>
找工作
(13)
>
考研
(12)
>
教师之家
(9)
>
博后之家
(5)
>
有机交流
(5)
>
招聘信息布告栏
(4)
小木虫论坛-学术科研互动平台
»
计算模拟区
»
分子模拟
»
Monte Carlo
»
【转帖】集合相等的蒙特卡罗算法
1
1/1
返回列表
查看: 1034 | 回复: 0
只看楼主
@他人
存档
新回复提醒
(忽略)
收藏
在APP中查看
zyj8119
木虫
(著名写手)
模拟EPI: 10
应助: 65
(初中生)
贵宾: 0.003
金币: 915.1
散金: 1440
红花: 35
帖子: 2936
在线: 1329.4小时
虫号: 664177
注册: 2008-11-29
性别: GG
专业: 理论和计算化学
[交流]
【转帖】集合相等的蒙特卡罗算法
CODE:
#include
#include
#include
#include
//============随机数类=================
const unsigned long maxshort=65536L;
const unsigned long multiplier=1194211693L;
const unsigned long adder=12345L;
class RandomNumber
{
private:
unsigned long randSeed; //当前种子
public:
RandomNumber(unsigned long s=0); //构造函数,缺省值0表示有系统自动产生种子
unsigned short Random(unsigned long n); //产生0:n-1之间的随机整数
double fRandom(void); //产生[0,1)之间的随机实数
};
RandomNumber::RandomNumber(unsigned long s)
{//产生种子
if(s==0)
randSeed=time(0); //用系统时间产生种子
else
randSeed=s; //由用户提供种子
}
unsigned short RandomNumber::Random(unsigned long n)
{//产生0:n-1之间的随机整数
randSeed = multiplier * randSeed + adder;
return(unsigned short)((randSeed>>16) % n);
}
double RandomNumber::fRandom(void)
{//产生(0,1)之间的随机实数
return Random(maxshort)/double(maxshort);
}
//===================================================
//=============合并排序算法====================
template
void Merge(T *c,T *d,int l,int m,int r)
{
int i=l,
j=m+1,
k=l;
while((i<=m)&&(j<=r))
if (c <=c[j]) d[k++]=c[i++];
else d[k++]=c[j++];
if(i>m) for (int q=j;q<=r;q++)
d[k++]=c[q];
else for(int q=i;q<=m;q++)
d[k++]=c[q];
}
template
void MergePass(T *x,T *y,int s,int n)
{
int i=0;
while(i<=n-2*s)
{
Merge(x,y,i,i+s-1,i+2*s-1);
i=i+2*s;
}
if (i+s
else for(int j=i;j<=n-1;j++)
y[j]=x[j];
}
template
void MergeSort(T *a,int n)
{
T * b = new T[n];
int s=1;
while (s
{
MergePass(a,b,s,n);
s+=s;
MergePass(b,a,s,n);
s+=s;
}
}
//==============二分查找算法==================
template
int BinarySearch(T *a, const T & x,int n)
{//在a[0]<=a[1]<= ... <=a[n-1]中搜索x,找到返回其位置,否则返回-1
int left=0;int right=n-1;
while(left <=right)
{
int middle=(left+right)/2;
if(x == a[middle]) return middle;
if(x > a[middle])
left=middle+1;
else
right=middle-1;
}
return -1;//未找到x
}
//=========判断两个集合相等的蒙特卡罗算法==============
bool Equal(int *S,int *T,int n)
{//判断两个集合相等的蒙特卡罗算法
static RandomNumber rnd;
int i= rnd.Random(n); //从集合T中随机选择一个元素,判断它是否在集合S中,
// cout << T <
if (BinarySearch(S,T,n)==-1) return false; //不在,返回false,即集合不相等
return true; //在,返回true,即集合相等
}
bool EqualMC(int *S,int *T,int n,double e)
{//重复多次调用算法Equal,确保错误率小于e
int k= int(ceil(log(e)/log(double(n-1)/double(n))));
// cout <<"k="<< k<
for(int i=1;i<=k;i++)
{
// cout <
";
if (!Equal(S,T,n))
{
// cout <
return false;
}
}
return true;
}
int main()
{
int n; //集合的元素的个数
int * S,*T; //待比较的两个集合
int i;
ifstream InFile("input.txt",ios::nocreate); //读取input.txt
if(InFile.fail()) //读取文件失败
{
cout<<"the input.txt is not exist!"<
return(1);
}
InFile >> n ; //集合的元素的个数
S=new int [n];
for( i=0; i
> S; //集合S的各元素
T=new int [n];
for( i=0; i
> T; //集合T的各元素
InFile.close();
//将集合S的元素进行排序预处理
MergeSort(S,n);
//cout <<"OK Sort"<
// for (i=0;i
// cout <
///*
ofstream OutFile("output.txt");
double e=0.001; //错误的概率
if (EqualMC(S,T,n,e))
OutFile <<"YES";
else
OutFile <<"NO";
delete []S;
delete []T;
return 0;
//*/
/*
//=========测试用,连续判断m次,看得到的结果正确的次数和错误的次数
int a=0,b=0,m=1;
double e=0.01;
for(i=1;i<=m;i++)
{
if (EqualMC(S,T,n,e))
a++;
else
b++;
}
cout <<"Yes " <
cout <<"NO " <
//==============================================================
*/
/*
//==========产生测试用数据===================
ofstream OutFile("input.txt");
n=10000;
OutFile<< n<
for( i= 0 ;i
OutFile<
for( i= 0 ;i
OutFile<
//=========================================
*/
}
le e=0.01;
for(i=1;i<=m;i++)
{
if (EqualMC(S,T,n,e))
a++;
else
b++;
}
cout <<"Yes " <
cout <<"NO " <
//==============================================================
*/
/*
//==========产生测试用数据===================
ofstream OutFile("input.txt");
n=10000;
OutFile<< n<
for( i= 0 ;i
OutFile<
for( i= 0 ;i
OutFile<
//=========================================
*/
}
[
Last edited by zyj8119 on 2010-10-17 at 01:27
]
回复此楼
» 猜你喜欢
读博
已经有5人回复
到新单位后,换了新的研究方向,没有团队,持续积累2区以上论文,能申请到面上吗
已经有13人回复
博士申请都是内定的吗?
已经有6人回复
之前让一硕士生水了7个发明专利,现在这7个获批发明专利的维护费可从哪儿支出哈?
已经有5人回复
博士读完未来一定会好吗
已经有29人回复
投稿精细化工
已经有4人回复
高职单位投计算机相关的北核或SCI四区期刊推荐,求支招!
已经有4人回复
导师想让我从独立一作变成了共一第一
已经有9人回复
心脉受损
已经有5人回复
Springer期刊投稿求助
已经有4人回复
高级回复
好好学习,天天向上。
1楼
2010-10-17 01:25:03
已阅
回复此楼
关注TA
给TA发消息
送TA红花
TA的回帖
智能机器人
Robot
(super robot)
我们都爱小木虫
找到一些相关的精华帖子,希望有用哦~
算法之道,全本,共313页
已经有195人回复
求助:利用蒙特卡罗方法和遗传算法求解可靠度的程序
已经有13人回复
简单的蒙特卡罗问题?(关于多孔介质的随机分形)
已经有3人回复
【转帖】蒙特卡罗算法计算圆周率
已经有12人回复
【求助】求 蒙特卡罗 代码
已经有4人回复
【分享】佛经大集合【已搜索无重复】
已经有13人回复
蒙特卡罗中的晶体生长模型
已经有22人回复
点击这里搜索更多相关资源
科研从小木虫开始,人人为我,我为人人
相关版块跳转
第一性原理
量子化学
计算模拟
分子模拟
仿真模拟
程序语言
我要订阅楼主
zyj8119
的主题更新
1
1/1
返回列表
如果回帖内容含有宣传信息,请如实选中。否则帐号将被全论坛禁言
普通表情
龙
兔
虎
猫
高级回复
(可上传附件)
百度网盘
|
360云盘
|
千易网盘
|
华为网盘
在新窗口页面中打开自己喜欢的网盘网站,将文件上传后,然后将下载链接复制到帖子内容中就可以了。
信息提示
关闭
请填处理意见
关闭
确定