当前位置:C++技术网 > 资讯 > 任意范围的小数生成算法

任意范围的小数生成算法

更新时间:2015-12-01 22:16:35浏览次数:1+次

首先说明一下。在我们使用了

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;
}

运行结果: