给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
- 给Super-smack的gen-data程序添加小数格式支持
- 给Super-smack的gen-data程序添加time格式支持
- 给Super-smack的gen-data程序添加整数长度控制
- super-smack
- super smack
- 给vs2010添加对usf,mm,msf格式支持
- 给EditText添加一个工具方法,使其支持仅保留到第N位小数
- 给自己的Blog程序添加对Windows Live Writer的支持
- 给自己的Blog程序添加对Windows Live Writer的支持
- 给自己的Blog程序添加对Windows Live Writer的支持
- 给自己的Blog程序添加对Windows Live Writer的支持
- 【转】给自己的Blog程序添加对Windows Live Writer的支持
- 添加nand flash 的支持给osk5912
- 给自己的开源库添加cocopods支持
- Windows XP 更新程序 (KB955704) 添加对exFAT文件系统格式的支持
- JConsole:给普通命令行程序和Tomcat添加JMX支持
- super-smack安装
- Mysql 压力测试工具super-smack的安装
- 低年级学生必读——牛人的大学四年是这样过的
- 有点累
- jquery 获取ckeditor值
- 如何做网上贸易
- C# 操作摄像头
- 给Super-smack的gen-data程序添加小数格式支持
- 驱动调试常见问题_LCD
- Handler 基础认识
- 第六章 13_总结
- ArcGis Server + Flex 部署问题汇集
- makefile的四种赋值
- 驱动调试常见问题_触摸屏
- JQuery事件方法汇总
- HDOJ 1597,1058