论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C语言实例教程:随机数

文章类别:C语言程序设计 | 发表日期:2010-11-8 9:01:10

#include<stdlib.h>
#include<time.h>
#include<stdio.h>
 
void main()

 int i,k,range,n,a[100];
 int min,max,flag=0;
 long t;
 double j;
 

 min=50;
 max=500;
 range=max-min;
 srand((unsigned)time(&t)); /* 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;*/
 
do{ for(i=0;i<100;i++)
 { 
 n=rand(); /*调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
 根据需要多次调用rand(),从而不间断地得到新的随机数;*/
 
 j=((double)n/(double)RAND_MAX); /*把随机数除以RAND_MAX,从而产生一个在0到1之间的校正值;*/

 n=(int)(j*(double)range); /*把校正值乘以所需要的范围值(即500-50)从而产生一个在0到43之间的值*/
 n+=min; /*把该值和所要求的最小值相加,从而使该值最终落在正确的取值范围----1到44之间。*/
 a[i]=n;
 }

 for(i=0;i<99;i++) /* 判断这100个数是否重复,如果是,再生成一次,直到各不相同为止,也可以不要这段,呵呵*/
 { for(k=i+1;k<100;k++)
 if(a[i]==a[k]) flag=1;flag=0;}

}while(flag);
 printf("The random number is:\n"); /*产生100个50—500个随机数,并且排成10行10列*/
 for(i=0;i<100;i++)
 { printf("%d ",a[i]);
 if((i+1)%10==0) printf("\n");}
 
}

* 判断这100个数是否重复,如果是,再生成一次,直到各不相同为止,也可以不要这段,呵呵*/ 

----------------------------------------------------------
这一段,偶认为这种算法是不可取的。
要生成不重复的随机数,最好是这样做:

例如要生成 1-100的50个数:
int num[100];
int i;
int t, a, b;

for(i = 0; i < 100; i++) {
 num[i] = i;
} //初始化

for(i = 0; i < 500; i++) {
 a = rand() % 100;
 b = rand() % 100;
 t = num[a];
 num[a] = num[b];
 num[b] = t;
}
也即是交换随机位置的两个数。
最后,num[0] -- num[49]即是所求的50个数。
如3楼那样,应该会产生很多重复的随机数,这就造成程序中要进行大量的判断,降低效率。
在以前有贴子专门说过类似问题,可以避免如此大量的重复随机数。
如下例子:
main() 

int i,k,r; 
for(i=0;i<100;i++) 

srand((i+GetTickCount())); 
for(k=0;k<50;k++) 
{r=rand(); 
r=rand(); 
printf("%d ",r); 

}

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058