#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);
}
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |