随机算法c
#include<stdio.h>
#include<stdlib.h>
intmain()
{
inti,count,n,m;
srand(time(NULL));
//以当前时间为随机数种子,以产生不同的随机数列
n=(rand(n)%100)+1;
count=1;
while(count<=10){
printf("输入您的猜测数字(1~100):");
scanf("%d",&m);
if(m==n){
printf("恭喜您猜对了!总计猜%d次! ",count);
return0;
}
elseif(m<n){
printf("太小,");
}
else{
printf("太大,");
}
printf("剩余%d次机会! ",10-count);
count++;
}
printf("超出尝试次数,游戏结束! ");
return0;
}
❷ 求“米勒-拉宾素数随机测试算法”C语言代码+详细注释。财富不是问题!!!
//参数入口为test(lld n)
typedef __int64 lld;
const lld MAX=10;
lld multi(lld a,lld b,lld m)//加法代替乘法,防止溢出__int64
{
lld ret=0;
a%=m;
while(b)
{
if(b&1) if((ret+=a)>=m) ret-=m;
if((a<<=1)>=m) a-=m;
b>>=1;
}
return ret;
}
lld mod(lld a,lld b,lld m)
{
lld x,y;
if(b==1)//1次幂,直接返回
return a%m;
x=mod(a,b>>1,m);//二分求幂
y=multi(x,x,m);//平方一下
if(y==1&&x!=1&&x!=m-1)//如果结果是1的时候,如果x不是1而且不是m-1那么m必然不是素数。
return 0;
if(b&1)//奇数的情况,再乘上一个a
y=multi(y,a,m);
return y;
}
lld gen(lld m)
{
lld ret=1,i;
for(i=0;i<4;i++)
ret*=rand();
ret%=m;
if(ret<0)
ret+=m;
return ret;
}
//入口
bool test(lld n)
{
lld a,i,tmp;
if(n<2)//小于2不是素数
return 0;
if(n==2)//2是素数,直接返回
return 1;
if((n&1)==0)//偶数
return 0;
for(i=0;i<MAX;i++)//测试最大次数
{
a=gen(n-1)+1;//生成一个2到n-2的数字
tmp=mod(a,n-1,n);//快速幂
if(tmp!=1)//结果不是1,不是素数
return 0;
}
return 1;//是素数
}
❸ 如何运用C语言实现随机事件
问题1:随机事件的C/C++语言实现。
第1题:产生随机数(完型填空)
(1)函数说明
rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。
0<= rand()<=RAND_MAX(32767=216-1)
试问:产生0到100之间的随机数的C表达式是什么?
100*rand()/32767
(2)参考“原型”
#include "iostream.h"
#include "stdlib.h"
#include "time.h" /*需引用的头文件*/
void out_rand()
{
srand(time(0)); //随机种子
for(int i=0;i<10;i++)//产生10个0到100随机数
{
cout<<100*rand()/RAND_MAX<<endl;
}
}
void main()
{
int n;
while(1)
{
cout<<”1----产生随机数; 2----退出系统”<<endl;
cin>>n;
if(n==1) out_rand();
if(n==2) break;
}
}
(3)设计任务(“好”的算法:时间代价——语句、空间代价——占用“内存”)
利用产生随机数的编程技术,产生一个随机系统48个0到99之间的“需求量”随机数,并按间距为10统计各“需求量”区间的数据个数。
#include “iostream.h”
#include “stdlib.h”
#include “time.h” (填空)
void out_rand()
{
int a[48],I,k;(填空)
for(i=0;i<48;i++) a[i]=0;
srand(time(0));
for(i=0;i<48;i++)
{
k=(99-0+1)* rand()/RAND_MAX+0;
a[(k-0)/10]++;
(例子:
k=(199-100+1)* rand()/RAND_MAX+100;
a[(k-100)/10]++;
)
}
for(i=0;i<100;i+=10)
{
cout<<i<<”----“<<i+9<<”的数据个数: “<<a[(i-0)/10](要改)<<endl;
}
}
void main()
{
int n;
while(1)
{
cout<<”1----产生随机数; 2----退出系统”<<endl;
cin>>n;
if(n==1) out_rand();(填空)
if(n==2) break;
}
}
问题2:数据排序的C/C++语言实现。
第1题:起泡法(上推排序法)
1、“原型”(从小到大排序)
#include “iostream.h”
void bubble_sort(int *item,int count)
{
register int I,j;
int t;
for(i=0;i<count-1;i++)
//每一遍后都能将i及其后面的数据中的最小值排在最前面(i处)。
for(j=count-1;j>=I;--j)
if(item[j-1]>item[j])
{t=item[j-1];item[j-1]=item[j];item[j]=t;}
}
void main()
{
int a[]={6,8,3,9,7,4,5,1,2};
bubble_sort(a,9);
for(int i=0;i<9;i++)
cout<<a[i]<<” “;
cout<<endl;
}
2、实践
(1)调试该“原型”,分析其执行功能。
(2)从键盘输入10个“实数”,请用“起泡法”对其进行从大到小并输出。
#include “iostream.h”
void bubble_sort(int *item,int count)
{
register int I,j;
int t;
for(i=0;i<count-1;i++)
for(j=count-1;j>=I;--j)
if(item[j-1]<item[j])
{t=item[j-1];item[j-1]=item[j];item[j]=t;}
}
void main()
{
int a[10];
int i;
for (i=0;i<10;i++)
cin>>a[i];
bubble_sort(a,10);
for(i=0;i<10;i++)
cout<<a[i]<<” “;
cout<<endl;
}
第2题:选择排序法
1、“原型”
#include “iostream.h”
void select_sort(double *item,int count)
{
register int I,j,k;
double t;
for(i=0;i<count-1;i++) //每趟只进行一次交换
{
k=I;
for(j=i+1;j<count;++j)
if(item[k]>item[j]) k=j; //将较小的数排到前面
t=item[k];item[k]=item[i];item[i]=t;
}
}
void main()
{
double b[]={6.8,8.7,3.9,9.6,7.4,4.3,5.2,1.5,2.0};
select_sort(b,9);
for(int i=0;i<9;i++)
cout<<b[i]<<” “;
cout<<endl;
}
2、实践
(1)调试该“原型”,分析其执行功能,并比较其与“起泡法”排序算法的运行时间代价(“最坏”情形)。
(2)从键盘输入10个学生的“英文名”,请用“选择排序法”对其进行从小到大并输出。
提示:C/C++中,比较两个字符串的大小:strcmp(str1,str2),复制字符串:strcpy(str1,str2),头文件是:string.h
//参考答案
#include “iostream.h”
#include “string.h”(填空)
#include “conio.h”
void main()
{
char item[10][21];
int I,j,k;
char t[21];
cout<<”从键盘输入10个学生的英文名:”<<endl;
for(i=0;i<10;i++)
cin>>item[i];(填空)
//排序
for(i=0;i<9;i++)
{
k=i;
for(j=i+1;j<10;++j)
if(strcmp(item[k],item[j])>0) k=j;
strcpy(t,item[k]);strcpy(item[k],item[i]);strcpy(item[i],t);
}
//输出
for(i=0;i<10;i++)
cout<<item[i]<<endl;
getche();
}
第3题【《信息管理技术》机试题-条件查询问题】:下列程序的功能是:选出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果cnt和sum输出到文件OUT13.DAT中。
部分源程序已经给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include <stdio.h>
int cnt,sum;
void writeDat(); //写盘函数的声明
void countValue()
{ }
void main()
{
cnt=sum=0;
countValue();
printf("满足条件的自然数的个数=%d\n",cnt);
printf("满足条件的自然数的和=%d\n",sum);
writeDat(); //调用写盘函数
}
void writeDat() //写盘函数的实现
{
FILE *fp;
fp=fopen("OUT13.DAT","w");
fprintf(fp,"%d\%d\n",cnt,sum);
fclose(fp);
}
////参考答案/////////
void countValue()
{
int i,thou,hun,ten,data;
for(i=5000;i>=1000;i--)
{
thou=i/1000;
hun=i%1000/100;
ten=i%100/10;
data=i%10;
if(thou+hun==ten+data && thou+hun==(data-thou)*10)
变化的是条件!!!参考答案的其他内容都要记下来!!!
{ sum+=i; cnt++; }
}
}
要求:
(1)调试该程序。
(2)用文字说明countValue()“算法”的控制流程。
第4题【《信息管理技术》机试题-出圈问题】:设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序每10人一组,给出这n个人的顺序表。请考生编制函数Josegh()实现此功能,并调用函数writeDat()把结果p输出到文件JOSE.DAT中。
设n=100,s=1,m=10。
(1)将1到n个人的序号存入一维数组p中;
(2)若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;
(3)重复第(2)步直至圈中只剩下p[1]为止。
注意:部分源程序已经给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include <stdio.h>
#define N 100
#define S 1
#define M 10
int p[100],n,s,m;
void writeDat(void);
void Josegh(void)
{ }
void main()
{
m=M; n=N; s=S;
Josegh();
writeDat();
}
void writeDat(void)
{
int i;
FILE *fp;
fp=fopen("JOSE.DAT","w");
for(i=N-1;i>=0;i--)
{
printf("%4d",p[i]);
fprintf(fp,"%4d",p[i]);
if(i%10==0)
{
printf("\n");
fprintf(fp,"\n");
}
}
fclose(fp);
}
////参考答案/////////
void Josegh(void)
{
int i,j,k,s1,w;
s1=s;
for(i=1;i<=n;i++)
p[i-1]=i;//给每个人编号
for(i=n;i>=2;i--)
{
s1=(s1+m-1)%i;
if(s1==0) s1=i;
w=p[s1-1];
for(j=s1;j<=i-1;j++)
p[j-1]=p[j];
p[i-1]=w;
}
}
❹ 求高速产生随机全排列的c(c++)算法
我的思路是这样的:
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
using namespace std;
void main()
{
int Array[100],i;
srand(time(NULL));
Array[0]=rand()%256;
for (i=1;i<100;i++){
Array[i]=(Array[i-1]+rand()%256);//在上一个数的基础上加上一个随机数
if (Array[i]>256){i--;continue;}//判断下是不是大于256若是则重新生出
}
}
❺ 随机算法
一般用a=rand(n),为了防止重复用srand(time(NULL)); 很简单的
❻ 求从n个数中抽取随机数的c语言算法。
int a[9][8];定义数组包含math.h time.h头文件 运用rand()函数和系统时间用系统的时间做随机种子。对产生的随机数%100就能保证随机数都<100.最后加1,EQlxCg
❼ c语言自己怎么写随机函数的算法
随机函数一种思维是获取电脑时间的毫秒值,再根据这个值做下处理,这样就可以生成随机数了。
延时函数可试下sleep函数
❽ 用C语言产生随机数
C语言太久没碰了,函数都不太记得了..就记个思路吧.
从题面来讲..产生 数为 某范围内的数字且不能重复.
那么可以把这些数据先放在一个栈里.然后随机产生一个要得到的下标...从栈里取出.
此时技术要点在于 数组的栈操作,int splice(int[] arr,int outIndex),把outIndex下标的元素移出栈,
第二点是 产生随便下标, 产生随机数前要 初始化 随机种子(或叫 随机列表)
void srand(long seed) 函数,一般都给一个时间戳作为参数,这样就能让程序在什么时候运行都得到一个不一样的随机列表.
int outIndex = randomize(stackLength) 产生 0到stacklength-1 之间的整数,正好是栈的有效下标...然后 取栈元素 便可以得到所要的效果