当前位置:文档之家› C语言中互不相同随机数的应用研究

C语言中互不相同随机数的应用研究

C语言中互不相同随机数的应用研究
C语言中互不相同随机数的应用研究

C语言中产生随机数的方法

C语言中产生随机数的方法 引例:产生10个[100-200]区间内的随机整数。 #include #include //rand函数的头文件 #include //时间函数的头文件 int main() { int i; //循环变量 srand((unsigned) time(NULL)); //产生随机数的起始数据(以时间为种子) for (i=0; i<10; i++) //printf("%d\n", rand()); //产生[0,0x7fff)即[0,32767)以内的随机整数 //printf("%d\n", rand()%100); //产生0-99的随机整数 printf("%d\n", rand()%(200-100+1) + 100); //产生[100,200]内的随机整数return 0; } 在C语言中产生随机数需要以下几个函数的配合使用。 (1)rand函数——产生伪随机数 原型:int rand(void) 头文件:stdlib.h 功能:产生从0到RAND_MAX之间的随机数。RAND_MAX的值通常是0x7fff(十六进制数7FFF,也就是十进制数32767)。 例: #include #include int main() { int k; k = rand(); printf("%d\n", k); return 0; } 编译运行,发现每次运行程序产生的随机数都是一样的。 计算机中产生随机数,实际是采用一个固定的数作为“种子”,在一个给定的复杂算法中计算结果,所以叫“伪随机数”。 C语言中由于采用固定的序列作为种子,所以每次执行所取的是同一个数。 为上面的例子增加一个循环结构: #include #include int main() { int k,i;

第三讲 排序算法(7.28语言提高班)

第三讲排序算法(7.28)(语言提高班) 目录 训练1.明明的随机数(Noip2006普及组第1题) (1) 训练2.众数(masses.cpp) (2) 训练3.车厢重组(carry.cpp) (2) 训练4.军事机密(secret.cpp) (2) 训练5.排名 (3) 训练6.奖学金(Noip2007 普及组第1题) (3) 训练7.统计数字(Noip2007) (5) 训练8.输油管道问题 (5) 训练9.奇数单增序列 (6) 训练10.整数奇偶排序 (6) 训练11:合影效果 (7) 训练12:分数线划定 (7) 训练13:病人排队 (8) 训练14:单词排序 (9) 训练1.明明的随机数(Noip2006普及组第1题) 【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行, 第1行为1个正整数,表示所生成的随机数的个数:N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400

用C语言产生随机数

用c语言产生随机数 在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。 可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。 rand()会返回一随机数值,围在0至RAND_MAX 间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767),运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。具体见下面的例子。 一如何产生不可预见的随机序列呢 利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值围从0~65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),从而不间断地得到新的随机数; 4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 下面是0~32767之间的随机数程序: #include #include #include //使用当前时钟做种子 void main( void ) {int i; srand( (unsigned)time( NULL ) ); //初始化随机数for( i = 0; i < 10;i++ ) //打印出10个随机数 printf( " %d\n", rand() ); } 根据上面的程序可以很容易得到0~1之间的随机数:

C语言随机函数

编程时有时需要随机输入一些数,这是调用随机函数可以完成此相命令. # include “stdio.h” # include “stdlib.h” # include “time.h” /*需引用的头文件*/ srand((unsigned)time(NULL)); /*随机种子*/ n=rand()%(Y-X+1)+X; /*n为X~Y之间的随机数*/ int rand(void) 函数int rand( void );返回的是一个界于0~32767(0x7FFF)之间的伪随机数,包括0和32767。C预先生成一组随机数,每次调用随机函数时从指针所指向的位置开始取值,因此使用rand()重复运行程序产生的随机数都是相同的,可以通过srand()函数来改变指针位置。 void srand( unsigned int seed ) 改变随机数表的指针位置(用seed变量控制)。一般配合time(NULL)使用,因为时间每时每刻都在改变,产生的seed值都不同。 一直被这个东西弄得模糊不清,终于又去整理了一下.弥补一些细节 主要是对rand()函数的使用//#include 原型int rand(void); 例如:void myrand(int imax) { assert(imax>0); int num = rand(); if(num<=imax) { return num; } else { return (num%imax); }

} 功能产生0到RAND_MAX之间的随机整数.至于RAND_MAX有多大,可以自己编程的时候输出.这是库里自带的宏定义. 像这样的一个函数,就产生了一个0到imax的随机整数.但是,当你多次运行你会发现,每一次产生的值都是一样的.并不是说没有随机,而是随机数发生器(程序产生的随机数是依靠时钟钟断来产生的.因此并不是真正意义上的随机.但对于我们来说,已经够用了)没有被重置.导致结果相同.那下面就看一下几种初始化随机数发生器的办法. srand()函数: 原型: void srand(unsigned seed) 功能: 产生随机数的起始发生数据,和rand函数配合使用 头文件: stdlib.h time.h 例: #include #include #include int main(void) { int i; time_t t;

NOIP2006普及组(复赛)

第十二届全国青少年信息学奥林匹克 联赛复赛试题 (NOIP2006普及组) 竞赛时间:2006年11月18日下午1:30-4:30 关于竞赛中不同语言使用限制的说明 一.关于使用Pascal语言与编译结果的说明 1.对于Pascal语言的程序,当使用IDE和fpc编译结果不一致时,以fpc的编译结果为准。2.允许使用数学库(uses math子句),以及ansistring。但不允许使用编译开关(最后测试时pascal的范围检查开关默认关闭:{$R-,Q-,S-}),也不支持与优化相关的选项。 二.关于C++语言中模板使用的限制说明 1.允许使用的部分: 标准容器中的布尔集合,迭代器,串,流。 相关的头文件: 2.禁止使用的部分: 序列:vector,list,deque 序列适配器:stack, queue, priority_queue 关联容器:map, multimap, set, multiset 拟容器:valarray 散列容器:hash_map, hash_set, hash_multimap, hash_multiset 所有的标准库算法 相关头文件:

1.明明的随机数 (random.pas/c/cpp) 【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数: N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400 2.开心的金明 (happy.pas/c/cpp) 【问题描述】 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,j k,则所求的总和为: v[j1]*w[j1]+v[j2]*w[j2]+ …+v[j k]*w[j k]。(其中*为乘号) 请你帮助金明设计一个满足要求的购物单。 【输入文件】 输入文件happy.in 的第1行,为两个正整数,用一个空格隔开: N m

C语言编程题精选

1. 有函数F(x)=(x+1)2和G(x)=2x+1,输入X值计算F(G(x))的值。 2. 任意输入三个字符,要求首先按逆序输出,然后同行原序输出。 3. 在屏幕上输出如下图案(考虑能否将输出的行数由输入的值来控制): ****** ****** ****** ****** 4. 在屏幕上输出如下图案(考虑将输出的行数由输入的值来控制): * ** *** **** ***** 5. 编程输出如下格式图形(考虑将输出的行数由输入的值来控制): * *** ***** ******* 6. 编程输出如下格式图形(考虑将输出的行数由输入的值来控制): **** *** ** * 7. 编程输出如下格式图形(考虑将输出的行数由输入的值来控制): ******* ***** *** * 8. 编程输出如下格式图形(考虑将输出的行数由输入的值来控制): * *** ***** ******* ***** *** * 9. 编程输出如下格式图形(考虑将输出的行数由输入的值来控制): * *** ***** ******* 10. 编程输出如下格式图形(考虑将输出的行数由输入的值来控制): * ***

***** ******* ***** *** * 11. 编写打印如下图形的程序(考虑将输出的行数由输入的值来控制): * * * * * * * * * * * * * * * * * * * * 12. 编制程序打印如下图形(考虑将输出的行数由输入的值来控制): A BBB CCCCC DDDDDDD EEEEEEEEE FFFFFFFFFFF GGGGGGGGGGGGG 13. 编程打印图形(考虑将输出的行数由输入的值来控制): 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 14. 编程打印图形(考虑将输出的行数由输入的值来控制): 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 15. 编程打印图形(考虑将输出的行数由输入的值来控制): 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 3 2 1 1 2 3 2 1 1 2 1 1 16. 编程打印图形(考虑将输出的行数由输入的值来控制): 1 1 1 1 2 1 1 3 3 1

C语言生成随机函数

程序有一个参数,表示生成的密码的长度 运行的时候要加上,比如./password 8 我写的很简单,参数没做检查,你应该自己去完善一下。 #include #include #include void generate(int len,char* buffer) { /*产生密码用的字符串*/ static const char string[]= "0123456789abcdefghiljklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i = 0; for(; i < len; i++) { buffer[i] = string[rand()%strlen(string)]; /*产生随机数*/ } } int main(int argc, char* argv[]) { int len = atoi(argv[1]); /*指定生成的密码长度*/ srand(time(0)); /*设定随机数种子*/ char *buffer = (char*)malloc(len + 1); /*分配内存*/ generate(len,buffer); /*生成密码*/ puts(buffer); /*输出到屏幕*/ FILE* fp = fopen("pass","w"); /*打开输出文件*/ if(fp == NULL) return -1; fwrite(buffer, sizeof(char), len, fp); /*写文件*/ fclose(fp); /*关闭文件*/ free(buffer); /*释放动态分配的内存*/ return 0; /*程序结束*/ } 自己可以写一个函数。 IT生活系列群: 50337593 IT-live(软件开发) 计算机软件技术群,技术是相通的,大家取长补短,共同进步吧!--软件不仅仅是一种思想。他是一门艺术 30633141 IT-live(网站建设)

华为机试

1、字符串最后一个单词长度 题目描述 计算字符串最后一个单词的长度,单词以空格隔开。 输入描述: 一行字符串,长度小于128。 输出描述: 整数N,最后一个单词的长度。 输入例子: hello world 输出例子: 5 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String str = in.nextLine(); String strs[] = str.split(" "); int length = strs.length; String lastWord=strs[length-1]; System.out.println(lastWord.length()); } in.close(); } } 2、计算字符个数 题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。 输入描述: 输入一个有字母和数字以及空格组成的字符串,和一个字符。 输出描述: 输出输入字符串中含有该字符的个数。 输入例子: ABCDEF A

import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); String str= in.nextLine().toUpperCase(); int count=0; String str2 = in.nextLine().toUpperCase(); char ch = str2.charAt(str2.length()-1); for(int i=0;i

浅谈C语言中如何取随机数

浅谈C语言中如何取随机数 级别:初级 1. 基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand (unsigned int n); rand()函数和srand()函数被声明在头文件stdlib.h中,所以要使用这两个函数必须包含该头文件: #include 2. 使用方法 rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。RAND_MAX常量被定义在stdlib.h头文件中。其值等于32767,或者更大。 srand()函数使用自变量n作为种子,用来初始化随机数产生器。只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。 举个例子,假设我们要取得0~10之间的随机整数(不含10本身): /* 例1:不指定种子的值*/ for (int i=0; i<10; i++) { printf("%d ", rand()%10); } 每次运行都将输出:1 7 4 0 9 4 8 8 2 4 /* 例2:指定种子的值为1 */ srand(1); for (int i=0; i<10; i++) { printf("%d ", rand()%10); } 每次运行都将输出:1 7 4 0 9 4 8 8 2 4 例2的输出结果与例1是完全一样的。 /* 例3:指定种子的值为8 */ srand(8); for (int i=0; i<10; i++) { printf("%d ", rand()%10); } 每次运行都将输出:4 0 1 3 5 3 7 7 1 5 该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。 /* 例4:指定种子值为现在的时间*/ srand((unsigned)time(NULL)); for (int i=0; i<10; i++) { printf("%d ", rand()%10); } 该程序每次运行结果都不一样,因为每次启动程序的时间都不同。另外需要注意的是,使用time()函数前必须包含头文件time.h。

随机数

1.明明的随机数(random.pas/c/cpp) *题目部分 【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数:N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个

数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400 *解答部分 此题是一道基础题,主要考了排序算法以及文件的简单操作。 我们先看此题的数据量N≤100,很容易想到此题可以用冒泡/直接插入/选择排序等时间复杂度为O(n*n)的算法。而且这样做不会超时。 实际上,由于0

注意点一:打印时,最后切勿多打空格,否则0分。 具体代码如下: program noip2006_1_random; const maxn=1050; var a:array[1..maxn]of boolean; i,n,x,max:longint; procedure first; begin assign(input,'random.in'); assign(output,'random.out'); reset(input);rewrite(output); end; Begin first; readln(input, n);max:=0; fillchar(a,sizeof(a),0); for i:=1 to n do begin read(input,x);

C语言产生随机整数的方法

产生随机整数的方法: #include #include …… srand((unsigned long)time(0)); /*产生随机数种子*/ a=rand()*limit/RAND_MAX; /*rand()在C语言中称为随机函数,它的功能是产生一个不超过RAND_MAX的随机非负整数,RAND_MAX是符号常量,代表整型最大值,即随机数的最大值 32767。limit变量表示随机数的范围。例如产生一个100以内的随机数rand()*100.00/ RAND_MAX */ b=rand()*limit/RAND_MAX; a=rand()*limit/RAND_MAX; 计算机产生随机数,后一个是根据前一个产生的,这样第一个随机数称为种子。如果没有种子,计算机按默认计算,每次产生的数都一样。种子通常是利用系统时钟设定的:srand((unsigned long)time(0)) 产生随机整数的模板: #include "time.h" #include “stdlib.h” …… srand((unsigned long)time(0)); /*产生随机数种子*/ a=rand()*limit/RAND_MAX; //limit表示随机数范围0~limit。

b=rand()*limit/RAND_MAX; a=rand()*limit/RAND_MAX; 【例题】两个随机数的加减法 #include "time.h" #include "stdlib.h" #include "stdio.h" int main() { int a,b,z,limit; /* limit随机数的最大值——范围*/ printf("please input the limit\n"); scanf("%d",&limit); while(1) { srand((unsigned long)time(0)); /*产生随机数种子*/ a=rand()*limit/RAND_MAX; b=rand()*limit/RAND_MAX; a=rand()*limit/RAND_MAX; printf("%d+%d=",a,b); scanf("%d",&z); if((a+b)==z) printf("good!\n"); else printf("error!\n"); } while(1); return 0; }

(完整word版)排序例题

1、明明的随机数(Noip2006) 【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行, 第1行为1个正整数,表示所生成的随机数的个数:N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400 【参考程序】 //By LYLtim var n,s:byte; i,min,max,x:word; b:array[1..1000]of boolean; begin assign(input,'random.in');reset(input); assign(output,'random.out');rewrite(output); readln(n); fillchar(b,sizeof(b),false); min:=1000;max:=0;s:=0; for i:=1 to n do begin read(x); b[x]:=true; if xmax then max:=x; end; close(input); for i:=min to max do if b[i] then inc(s); writeln(s); for i:=min to max do if b[i] then write(i,' ');

用C语言的rand()和srand()产生伪随机数的方法总结

标准库(被包含于中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void); 从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。 函数二:void srand(unsigned seed); 参数seed是rand()的种子,用来初始化rand()的起始值。 可以认为rand()在每次被调用的时候,它会查看: 1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。 2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。 根据上面的第一点我们可以得出: 1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。 2)否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。 3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。 举几个例子,假设我们要取得0~6之间的随机整数(不含6本身): 例一,不指定seed: for(int i=0;i<10;i++){ ran_num=rand() % 6; cout<

排序算法题目及其代码

排序算法题目及其代码 1、明明的随机数(Noip2006) 【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行, 第1行为1个正整数,表示所生成的随机数的个数:N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400 【参考程序】 var n,s:byte; i,min,max,x:word; b:array[1..1000]of boolean; begin assign(input,'random.in');reset(input); assign(output,'random.out');rewrite(output); readln(n); fillchar(b,sizeof(b),false); min:=1000;max:=0;s:=0; for i:=1 to n do begin read(x); b[x]:=true; if xmax then max:=x; end; close(input); for i:=min to max do if b[i] then inc(s); writeln(s); for i:=min to max do if b[i] then write(i,' ');

C和C随机数或字符串生成源码图文稿

C和C随机数或字符串 生成源码 文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]

1. 基本函数 在C语言中取随机数所需要的函数是: rand()函数和srand()函数被声明在头文件stdlib.h中,所以要使用这两个函数必须包含该头文件: 2. 使用方法 rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。RAND_MAX常量被定义在stdlib.h头文件中。其值等于32767,或者更大。 srand()函数使用自变量n作为种子,用来初始化随机数产生器。只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。 每次运行都将输出:1 7 4 0 9 4 8 8 2 4

每次运行都将输出:1 7 4 0 9 4 8 8 2 4 例2的输出结果与例1是完全一样的。 每次运行都将输出:4 0 1 3 5 3 7 7 1 5 该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。

该程序每次运行结果都不一样,因为每次启动程序的时间都不同。另外需要注意的是,使用time()函数前必须包含头文件time.h。 3. 注意事项 求一定范围内的随机数。 如要取[0,10)之间的随机整数,需将rand()的返回值与10求模。randnumber =rand()% 10; 那么,如果取的值不是从0开始呢你只需要记住一个通用的公式。 要取[a,b)之间的随机整数(包括a,但不包括b),使用: (rand() % (b - a)) + a 伪随机浮点数。 要取得0~1之间的浮点数,可以用: rand() / (double)(RAND_MAX) 如果想取更大范围的随机浮点数,比如0~100,可以采用如下方法: rand() /((double)(RAND_MAX)/100) 其他情况,以此类推,这里不作详细说明。 当然,本文取伪随机浮点数的方法只是用来说明函数的使用办法,你可以采用更好的方法来实现。 举个例子,假设我们要取得0~10之间的随机整数(不含10本身):

实用C语言中有关随机函数的使用详解

c语言中有关随机函数的使用详解 在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。 可能大家都知道C语言中的随机函数random,可是random 函数并不是ANSI C标准,所以说,random函数不能在gcc,vc 等编译器下编译通过。 rand()会返回一随机数值,范围在0至RAND_MAX 间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767)我运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for 语句来设置种子的个数。具体见下面的例子。 一如何产生不可预见的随机序列呢 利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。 在C语言里所提供的随机数发生器的用法:现在的C编译

器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下: 1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),从而不间断地得到新的随机数; 4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 下面是0~32767之间的随机数程序: 复制代码代码如下: #include #inl #include #include #include main( ) { int i; srand( (unsigned)time( NULL ) ); for( i = 0; i 10;i++ )

随机数生成函数C

随机数生成函数srand() rand() 2007年12月11日星期二01:42 如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的,srand(n) for(10) rand() 也就是说,以一个固定的数值作为种子是一个缺点。通常的做法是以这样一句代码srand((unsigned) time(NULL));来取代,这样将使得种子为一个不固定的数,这样产生的随机数就不会每次执行都一样了。 1,先看一个例子 #include #include #include using namespace std; int main( void ) { int i; /* Seed the random-number generator with current time so that * the numbers will be different every time we run. */ srand( (unsigned)time( NULL ) ); /* Display 10 numbers. */ for( i = 0; i < 10;i++ ) printf( " %6d\n", rand() ); } 2.关于time.h time.h中包含很多有趣的函数,譬如 char *ctime(long *clock) 本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的 字符串:Mon Nov 21 11:31:54 1983\n\0 #i nclude #i nclude #i nclude using namespace std; void main() {

排序算法练习1

排序算法的应用 1.基本题 从键盘读入n,随机产生1-999之间的整数,用排序算法将这n个数从小到大排序并输出。要求如下: (1)用快速排序算法,输出排序的结果,要求输出每趟快速排序的结果。 (2)用基数排序算法,输出排序的结果,要求输出每趟搜集的排序结果。 2.纪念品分组 【题目描述】 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。 【输入】 输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上限。 第2行为一个整数n,表示购来的纪念品的总件数。 第3~n+2行每行包含一个正整数p i (5 <= p i <= w),表示所对应纪念品的价格。 【输出】 输出文件group.out仅一行,包含一个整数,即最少的分组数目。 【输入输出样例】 【限制】 50%的数据满足:1 <= n <= 15 100%的数据满足:1 <= n <= 30000, 80 <= w <= 200 3.明明的随机数

【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数: N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400 4.奖学金 【问题描述】 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是: 5 279 7 279 则按输出错误处理,不能得分。 【输入】

相关主题
文本预览
相关文档 最新文档