有关校内的第三次实验报告
实验2 万中生千随机数
需要调用stdlib.h头文件
stdlib.h
“stdlib.h是standard library标准库头文件,定位在通用工具函数:”
性质跟math.h差不多。
rand和srand函数是封装在该头文件中的。
同样,stdio.h是主司输入与输出的头文件:
scanf,printf等函数也是封装其中的。
rand和srand函数
了解皮毛:
用于产生种子,一般以系统时钟作为随机种子。
本质思想
线性同余法:通过对前一个数进行线性运算并取模从而得到下一个数。
不过也算稍微注意到了rand函数和srand函数的区别,后者在前者的基础上建立了种子库,调用了系统时钟这一随机种子,种子的目的也就是让rand函数每次从随机的种子开始。其根本思想为线性同余法,应该是将种子的数在某一线性公式中运算后与总随机数的范围数取余。
……反正能用就行!毕竟绝对随机数不是在我们能力范围的事情。
举例:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define L 1000 //原始矩阵的行数
int main()
{
int array[L];
int i, j;
srand(time(NULL));//使用系统时钟作为随机种子 1970年1月1日0点0分0秒到现在的秒数
for (i = 0; i < L; i++)
{
array[i] = rand() % 100 + 1;//生成1到100的随机数
}
有关随机数组中寻找相同元素:
最初想到的算法类似冒泡法:子母循环逐一往后推进寻找相同的数,定义一个记录相同此事的整型变量a,找到一个相同的元素之后a自加,并且将这一重复元素在数组中删除,防止下一轮母循环出现重复情况。(太**烦了)
……
视频中的思想是使用元素下标来对应记录元素的值,比如如果出现了两个1,那么array[1]对应的值就是2。
详细的讲,就是在另一处以这个随机数为下标(名字)对标创建一个仓库(新数组),该随机数在循环中再一次出现的时候,对应以其值为下标的新数组元素的值将自加。以此来记录该随机数出现了几次。
例题
完成如下功能:
① 由计算机随机产生1000个[0,10000]之间的整数,保存到数组中。
② 统计数组中不同元素的个数,并且以序对方式输出所有元素值及对应出现的次数,例如:(23,5)表示随机数23作为数组的元素出现了5次。(各主要功能建议定义函数)
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define L 1000 //原始数组元素数量
#define N 10000
int main()
{
int count[N] = {
0 };
int array[L] = {
0 };
int i;
srand(time(NULL));//使用系统时钟作为随机种子 1970年1月1日0点0分0秒到现在的秒数
for (i = 0; i < L; i++)
{
array[i] = rand() % 10000;//生成1到10000的随机数
count[array[i]]++;//用元素下标来记录元素数值
}
for (i = 0; i < L; i++)
{
if (count[i] != 0)
{
printf("(%i,%i)\n", i, count[i]);
}
}
return 0;
}