发信人: lostname(名字丢了) 
整理人: wenbobo(2003-08-23 11:05:56), 站内信件
 | 
 
 
    昨天要做一个抽样调查方案,结果发现我以前写的随机数程序没了。以前在网易里发布过,也没找到,只好重新写一个。
     该程序在我的机器上生成10万以内效果很好。如果需要更大的随机数,只要把程序中# define Times 50的50改大,当然运行时间就会更长了。
 
 /*
 程序名:SJS.C
 功能:生成一个随机数
 命令格式: SJS  下限  上限
 输出:一个均匀分布的随机数和次数
 操作系统:DOS、WINDOWS
 编译器:DOS下的C语言编译器,如TC等
 */
 
 # include <stdio.h>
 # define Times 50  /*  时钟计数器到下一个Times的倍数时,计数停止 */
 void main(int n,char *v[])
 {
 	int flag1,flag2;
 	long min,max,k,m,t,max0,max1,t1;
 	long tmp;      /*  临时变量  */
 	long far *time0;
 	if(n!=3)
 	{
 		puts("SJS  下限  上限");
 		return;
 	}
 	sscanf(v[1],"%ld",&min);  /*  下限  */
 	sscanf(v[2],"%ld",&max);  /*  上限  */
 	time0 = (long far *) 0x0000046c;  /* 时钟计数器的地址  */
 	k = 0;
 	m=0;
 	max0 = max -min;  /* 2倍长度,数字从最小数到最大,再从最大数到最小 */
 	max1=max0+max0;
 	t = *time0;  /* 起始时间 */
 
 	while(1)
 	{
 		t1=*time0;  /* 当前时间 */
 		flag1=(t != t1);
 		flag2=(t1 % Times == 0);
 		if(flag1 && flag2)
 			break;
 		k++;
 		if(k > max1)
 		{
 			k=0;
 			m++;  /*  数完了m次 */
 		}
 		else
 		{
 			tmp=0;
 			tmp++; /*  为了和k > max1的计算时间相同,也写两个没用的操作  */
 		}
 	}
 	if(k>max0)
 		k = max1 - k;  /* 从min数到max,再从max数回min */
 	printf("随机数是:%ld,共数了%ld遍\n",min+k,m);  
 /* 如果试了几次,m没超过1, 则需要把Times改大些 */
 }
  | 
 
 
 |