该程序在我的机器上生成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改大些 */
}