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

来源:互联网 发布:淘宝客店铺活动推广 编辑:程序博客网 时间:2024/05/16 16:56

        我们知道,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 %f50361.807911461473.570747276565.70772475913.36044753915.65676088626.0210903723604.85414617064.852480308916.722447457682.892819[root@localhost smack-data]# gen-data -n 10 -f %3f0.1110.7780.0000.7780.5560.7780.1110.3330.6670.111[root@localhost smack-data]# gen-data -n 10 -f %3-3f478.665153.268500.998991.904762.253590.869842.683707.40987.351565.496
        是不是很实用呢,赶紧试试吧。

        PS:编译指令:

cd super-smack-1.3 

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

        make


原创粉丝点击