我们知道,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