概述
为什么用时间做种子,随机数还是一样的?0
//用蒙特卡罗算法来估算回溯法的效率//蒙特卡罗算法的思想:如果根节点有m0个儿子结点满足约束条件,在第一层就有//m0个满足条件的节点,在这m0个节点中随机选择一个结点,例如X1,用... //用蒙特卡罗算法来估算回溯法的效率
//蒙特卡罗算法的思想:如果根节点有m0个儿子结点满足约束条件,在第一层就有
//m0个满足条件的节点,在这m0个节点中随机选择一个结点,例如X1,用约束方程检测X1的所有儿子结点
//测算出满足约束条件的儿子结点个数为m1个。这样第二层总共有m0*m1个结点满足约束条件
//一般地,在第i层总共就有m0*m1*m2*……*mi个结点满足约束条件。因此满足约束条件的结点总个数
//m=1+(m0*m1)+(m0*m1*m2)+……+(m0*m1*m2*……mn)个
#include
#include
#include
#include
#include
bool place(int k,int x[])//n后问题中判断某个皇后的位置是否和前面的发生攻击
{
int i;
for(i=1;i
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))
return 0;
return 1;
}
int choose(int **p,int num,int k)//随机选择一个合适的结点,继续往下搜索
{
int b;
srand((unsigned)time(NULL)); //生成随机数下标来随机取得数组中的一个元素
b=rand()%num+1;
cout<
return p[k][b];
}
int estimate(int n) //用蒙特卡罗算法来估算回溯法的效率
{
int m=0,r=1,k;
int *num=new int[n+1];
int *x=new int[n+1];
int **p;
p=new int*[n+1];
for(int i=0;i
p[i]=new int [n+1];
for(k=1;k<=n;k++)
{
num[k]=0;
for(int i=1;i<=n;i++)
if(place(i,x))
{
num[k]++; //统计有多少个儿子结点满足约束条件
p[k][num[k]]=i;
}
if(num[k]==0)
return m;
r=r*num[k];
m=m+r;
x[k]=choose(p,num[k],k);//随机选择一个结点继续往下搜索
}
return m;
}
void main()
{
int num1=0,num=0;
int n;
cout<
cin>>n;
for(int i=0;i<=8;i++) //用八条路径来测试平均结点个数
{
num1+=estimate(n);
}
num=num1/8;
cout<
}
放在main里面还是不行啊,那些数还是非常有规律的 展开
最后
以上就是害羞斑马为你收集整理的c语言 以时间做种子的随机数,为什么用时间做种子,随机数还是一样的?的全部内容,希望文章能够帮你解决c语言 以时间做种子的随机数,为什么用时间做种子,随机数还是一样的?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复