首先说明一下。在我们使用了
srand(time(NULL));
之后,初始化了时间种子,我们就可以通过
int x = rand ();
获取一个随机数了,当然这个数不是我们需要的,我们需要经过变换。如何变换?
首先,我们在C语言中有一个取模算法。比如我们需要一个 (15,20)范围的小数。我们这样子处理。
int x = rand () % 20;
为什么用 rand () % 20 呢?因为这个求模运算可以求得0 -- 20的数字。所以我们就得到了一个范围在 (0,20)区间的数字。
如何选择15以上的呢?很简单。一次生成不符合,那就生成多次。这样子:
do
{
int x = rand () % 20;
} while (x < 15)//注意这个15,这就是我们的下限
这样子就可以了,选择性生成。随机小数怎么办呢?
do
{
int x = rand () % 100;//用100表示我需要有两位小数点的小数
float y = (float)(rand () % 20 ) + x / 100;//加上这个小数点,x是100以内的数字,除以100,得到两位小数
} while (y < 15);//注意这个15,这就是我们的下限
就这样,搞定了、、、、
下面开始验证:
#include<stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
srand (time(NULL));
float num[1000]= {0}/*存放生成的随机数*/,y;
int q[5] = {0};//存放每个区间的频数
int x,i;
for ( i = 0; i < 1000 ; i++)
{
do
{
x = rand () % 100;//用100表示我需要有两位小数点的小数
y = (float)(rand () % 20 ) + (float)x / 100;//加上这个小数点,x是100以内的数字,除以100,得到两位小数
} while (y < 15);//注意这个15,这就是我们的下限
num[i] = y;
}
int j = 0;
while (j < 1000)
{
if (num[j] >= 15 && num[j] < 16)
q[0]++;
else if (num[j] >= 16 && num[j] < 17)
q[1]++;
else if (num[j] >= 17 && num[j] < 18)
q[2]++;
else if (num[j] >= 18 && num[j] < 19)
q[3]++;
else if (num[j] >= 19 && num[j] < 20)
q[4]++;
j++;
}
for (i = 0 ; i < 5 ; i++)
printf ("q[%d] = %d\n",i,q[i]);
printf ("[15,16] = %.3f [16,17] = %.3f [17,18] = %.3f [18,19] = %.3f [19,20] = %.3f\n",(float)q[0] / 1000,
(float)q[1] / 1000,
(float)q[2] / 1000,
(float)q[3] / 1000,
(float)q[4] / 1000);
printf ("sum = %.3f\n",(float)q[0] / 1000 + (float)q[1] / 1000 + (float)q[2] / 1000 + (float)q[3] / 1000 + (float)q[4] / 1000);
return 0;
}
运行结果: