给Super-smack的gen-data程序添加小数格式支持

        我们知道,Super-smack的gen-data程序能够产生%n和%d两种数据,%n是从1开始的序列,%d是随机数字。但是他们都只能是整数,无法产生随机小数。但是实际环境中,小数却有着大量的应用(商品单价,百分比等)。因此,对小数格式的支持是很有必要的。

        首先我们探讨下随机小数的产生方法。这方面的文章网络上已经很多了,我也不详细讨论了,只是简单回顾下。

        1.利用rand()函数产生随机数并转化成float型

        2.将float类型的随机数结果除以一个数字,让结果形成小数点

        这样一个简单的小数就产生出来了。但是我们可能还想要对小数的整数位的大小进行控制,小数位的精度进行控制,这个时候,我们就需要对上面的算法做一些改进。改进思路是这样的:

        1.产生随机数的整数部分

        2.产生随机数的小数部分

        3.将产生的整数部分与小数部分相加,形成最终要返回的随机数

        4.在返回的时候,利用格式化字符串,对小数精度进行控制

        下面是产生随机函数的具体的实现代码:

	void print_float(int integer_width, int decimal_width)
	{
  		double max_num = pow(10,integer_width == 0 ? 1 : integer_width)-1;
  		max_num = max_num < 0 ? 0 : max_num;

  		int integer_num = integer_width == 0 ? 0 : rand()%(int)max_num;
  		float rand_num = (float)rand()/(float)max_num;
  		float decimal_num = rand_num - (int)rand_num;

  		int decimal_current_width = get_float_decimal_part_length(decimal_num);

  		if((integer_width == 0)&&(decimal_width == 0))
  		{
   			 integer_num = rand();
   			 fprintf(out, "%f", (float)integer_num*100000/rand());
  		}
  		else
  		{
    			fprintf(out, "%.*f", decimal_current_width > decimal_width ? decimal_width : decimal_current_width, (float)integer_num + decimal_num);
  		}
	}
        在上面的实现代码中,调用了另一个函数get_float_decimal_part_length,这个函数是用来计算小数的实际位数的。当然如果你想在这里控制,也可以去掉,然后修改下fprintf函数的decimal_current_width > decimal_width ? decimal_width : decimal_current_width部分,修改为decimal_width即可。这个函数的用途,一看就能明白了吧?函数实现代码如下:

	int get_float_decimal_part_length(float num)
	{
  		int length = 0;

  		char numChar[100];
  		sprintf(numChar,"%f",num);

  		int currentIndex = 2;

  		do
  		{
    			if(numChar[currentIndex]!='\0')
    			{
        			length++;
        			currentIndex++;
    			}
    
  		} while (numChar[currentIndex]!='\0');

  		return length;
	}
        函数定义完了,当然需要调用了,调用的代码在print_row()函数中。找到print_row()函数,在default前面加上以下代码:

	case 'f':
		  print_float(min_width,width);
		  parse_state = ST_PLAIN;
		  break;
        保存文件,然后用编译指令编译,就可以得到支持float格式的gen-data工具了。格式标识符是%f。支持%f,%3f,%3-3f格式。

        下面是我的测试代码:

	[root@localhost smack-data]# gen-data -n 10 -f %f
	50361.807911
	461473.570747
	276565.707724
	75913.360447
	53915.656760
	88626.021090
	3723604.854146
	17064.852480
	308916.722447
	457682.892819
	[root@localhost smack-data]# gen-data -n 10 -f %3f
	0.111
	0.778
	0.000
	0.778
	0.556
	0.778
	0.111
	0.333
	0.667
	0.111
	[root@localhost smack-data]# gen-data -n 10 -f %3-3f
	478.665
	153.268
	500.998
	991.904
	762.253
	590.869
	842.683
	707.409
	87.351
	565.496
        是不是很实用呢,赶紧试试吧。

        PS:编译指令:

cd super-smack-1.3 

        ./configure --prefix=/usr/local/supersmack --with-mysql=/usr/local/mysql

        make


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值