一.随机数函数:
在库函数中有:
rand() 函数可以用来生成随机数,其原理为线性同余方程,因此其实际生成的数字:
X=(参数i*n+参数j)/模M;
需要三个参数来确定,实际是“伪随机数”,由百度发现,真正意义上的随机数是认为难以模拟的,真正的随机数必须涉及物理现象如“抛掷硬币各面朝上的次数”等。
rand()函数需要头文件 cstdlib;
在调用rand函数之前,需要对其进行初始化,也就是所谓的种种子,类似触发点的概念。
srand()需要同一个头文件。
为保证随意性,常用用方式是借助系统时间来做种子;
time()函数为取时间函数,其头文件为ctime;常用写法是“time(NULL)”或“time(0)”
要让随机数限定在一个范围,可以采用模除加加法的方式。
要产生随机数r, 其范围为 m<=r<=n,可以使用如下公式:
rand()%(n-m+1)+m
其原理为,对于任意数,
0<=rand()%(n-m+1)<=n-m
于是
0+m<=rand()%(n-m+1)+m<=n-m+m
即
m<=rand()%(n-m+1)+m<=n;
#include<ctime>
#include<cstdlib>
srand(time(NULL));
rand()%(90)+10;
作业代码:这个程序生成了10个各不相同的随机数,以数组形式存储,并且输出其中的素数:
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
int a[10];
srand(time(NULL));
int b,i=0,j,s;
for(i=0;i<=9;)
{
s=0;
b=rand()%(90)+10;
//保证生成随机数各自不相等
for(j=0;j<=i;j++)
{
if(b==a[j]) s++;
}
if(s==0)
{
a[i]=b;
i++;
}
else continue;
//符合,进入下一次循环,不符合?再来一遍。(划!重!点!)
}
for(i=0;i<=9;i++)
{
std::cout<<a[i]<<std::endl;
}
std::cout<<"其中的素数有:"<<std::endl;
for(i=0;i<=9;i++)
{
int m=0;
s=0;
for(j=2;j<a[i];j++)
{
m=a[i]%j;
if(m==0) s++;
}
if(s==0)
cout<<a[i]<<std::endl;
}
}
二.排序算法。
倒是没什么好讲的,只不过实际操作的时候很多细节需要注意。
各别地方直教人想起汉诺的塔。。
数组作为传值参数是第一次用,需要注意形式:
子函数头部参数表倒是没什么需要特别注意的,
主函数的调用语句切切记住,数组作实际参数的时候,写数组名字就可以!
#include<iostream>
using namespace std;
void max(int a[]);
void min(int a[]);
int main()
{
int i,j,a[10];
while(1)
{
cout<<"请输入a["<<i<<"]的值:"<<endl;
cin>>a[i++];
if(i>=10) break;
}
max(a);
min(a);
}
//降序排列
void max(int a[])
{
int temp,i,j;
for(i=0;i<=8;i++)
{
for(j=i+1;j<=9;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;//a[i]去偷a[j]的值。
}
}
}
cout<<"由大到小为:"<<endl;
for(i=0;i<=9;i++)
{
cout<<a[i]<<endl;
}
}
//升序排列
void min(int a[])
{
int temp,i,j;
for(i=0;i<=8;i++)
{
for(j=i+1;j<=9;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;//a[i]去偷a[j]的值。
}
}
}
cout<<"由小到大为:"<<endl;
for(i=0;i<=9;i++)
{
cout<<a[i]<<endl;
}
}