首页 > 代码库 > 利用Java随机,生成随机学生数据
利用Java随机,生成随机学生数据
为模拟向数据库中大量插入学生数据(注:此处应该用PreparedStatement、batchUpdate等批处理提高效率)的情形,通过Java随机来生成学生数据。
一、要生成的学生数据
students表设计如下:
其中前三项是数据库自动生成的,后面的10项需要程序生成。
>>基于实际要求,插入的Student数据中,major和jnshuId不能同时相同。但由于随机数的不确定性,在程序中限制两个Student的major和jnshuId不同时相同复杂而低效。因此,选择在数据库中将major和jnshuId设为联合唯一性索引,然后在插入数据时忽略重复值。
因此,设计RandomStudent类如下:
通过getStudent方法生成学生数据,其中的各种getXxx方法都是随机生成各种数据的静态方法。
public static Student getStudent() { Student stu = new Student(getName(), getMajor(), getJnshuId()); stu.setQq(getQq()); stu.setEntryTime(getEntryTime()); stu.setSchool(getSchool()); stu.setDailyUrl(getDailyUrl()); stu.setDesire(getDesire()); stu.setJnshuBro(getJnshuBro()); stu.setKnowFrom(getKnowFrom()); return stu; }
二、Java中的随机
Java中常见的有三种随机方式:
- java.lang.Math.random():返回一个0≤x<1.0的double值。在一次JVM的运行中,只创建一个伪随机数生成器,之后对该方法的所有调用,都是通过该生成器来生成随机数。此方法是同步的,可以在多线程中正确运行,但如果有大量线程需要高速生成随机数,对该生成器的争用会降低效率。
- java.util.Random类:实现更多功能的随机数生成。每创建一个对象就会创建一个伪随机数生成器,只要seed不同,生成的随机数序列就会不同;seed相同时,生成的随机数序列完全相同。该类有两种构造方法:
- Random():用某个seed创建一个随机数生成器。在一次JVM的运行中,创建每个随机数生成器的seed都不同。也就是说,用此方法创建的多个random对象,生成的随机数序列一定不同(除非用setSeed方法改变seed)。在多线程中,可以每个线程中创建一个random对象,这样就避免了对随机数生成器的争用。
- Random(long seed):用给定seed创建随机数生成器。可通过相同seed创建random对象,生成相同的随机数序列。
- java.security.SecureRandom类:提供强加密随机数生成器。
这里不需要用到多线程,也不需要多样化的随机数生成方法,选择Math.random()即可。
注意,用于生成int随机数时,(int) (x*Math.random())生成的随机数范围为0~x-1。
三、随机程序设计
各种获取随机值的函数,从随机类型上可以分为以下几种:
1.不确定的部分是一定范围内的随机数,比如getJnshuId()、getEntryTime()。
将范围的差值乘Math.random(),强转为范围类型后,加上范围最小值,即得范围内的随机数:
//例:获取范围在min到max之间的随机数(int)。 //按照Java惯例,范围含头不含尾。 int random = (int) ((max-min)*Math.random())+min;
2.从几个预设值中随机选取一个,比如getSchool()、getMajor()。
用1中方法获取数组角标范围内的随机数作为角标,获取数组值:
//例:随机选取5个字符中的1个。 char[] array = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘}; int pos = (int) (5*Math.random()); char random = array[pos];
3.长度随机,每个字符的值也随机,比如getName()、getQq()。
首先用1中方法获取长度的随机值,然后用for循环,以随机长度作为循环结束条件,每次循环中用2中方法获取随机字符,加到字符串中。
//例:随机5-10位长度的字符串,每个字符在字符数组中随机选取。 char[] array = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘}; int length = (int) ((11-5)*Math.random())+5; StringBuilder random = new StringBuilder(); for(int i = 0;i<length;i++) { int pos = (int) (10*Math.random()); random.append(array[pos]); }
String str = random.toString();
四、程序编写
整个程序代码如下:
1 /** 2 * @FileName:RandomStudent.java 3 * @description:用于生成随机学生数据的工具类 4 * @author Cage Yang 5 * @version 1.1 6 * Modified Date:2017年8月13日 7 * Why & What is modified: 8 * 1.将getName()、getQq()中,未完成的字符串类型改为StringBuilder,否则会产生大量垃圾字符串对象。 9 */ 10 package cn.cage.student; 11 12 import static java.lang.Math.random; 13 14 import java.sql.Date; 15 import java.util.Calendar; 16 17 /** 18 * @ClassName RandomStudent 19 * @description 20 * @author Cage Yang 21 */ 22 public class RandomStudent { 23 24 /** 25 * @description 随机生成学生数据,由这些数据创建学生对象并返回。 26 * @return 生成的学生对象 27 */ 28 public static Student getStudent() { 29 Student stu = new Student(getName(), getMajor(), getJnshuId()); 30 stu.setQq(getQq()); 31 stu.setEntryTime(getEntryTime()); 32 stu.setSchool(getSchool()); 33 stu.setDailyUrl(getDailyUrl()); 34 stu.setDesire(getDesire()); 35 stu.setJnshuBro(getJnshuBro()); 36 stu.setKnowFrom(getKnowFrom()); 37 return stu; 38 } 39 40 /** 41 * @description 随机生成学生姓名。有20种姓氏;名字长度可能有1-2位,共有6480中组合。共有129600种可能的姓名组合。 42 * @return 生成的学生姓名。 43 */ 44 public static String getName() { 45 String[] firstNameArray = { "李", "王", "张", "刘", "陈", "杨", "赵", "黄", "周", "吴", "徐", "孙", "胡", "朱", "高", "欧阳", 46 "太史", "端木", "上官", "司马" };// 20个姓,其中5个复姓 47 String[] lastNameArray = { "伟", "勇", "军", "磊", "涛", "斌", "强", "鹏", "杰", "峰", "超", "波", "辉", "刚", "健", "明", "亮", 48 "俊", "飞", "凯", "浩", "华", "平", "鑫", "毅", "林", "洋", "宇", "敏", "宁", "建", "兵", "旭", "雷", "锋", "彬", "龙", "翔", 49 "阳", "剑", "静", "敏", "燕", "艳", "丽", "娟", "莉", "芳", "萍", "玲", "娜", "丹", "洁", "红", "颖", "琳", "霞", "婷", "慧", 50 "莹", "晶", "华", "倩", "英", "佳", "梅", "雪", "蕾", "琴", "璐", "伟", "云", "蓉", "青", "薇", "欣", "琼", "宁", "平", 51 "媛" };// 80个常用于名字的单字 52 int firstPos = (int) (20 * random()); 53 StringBuilder name = new StringBuilder(firstNameArray[firstPos]); 54 int lastLen = (int) (2 * random()) + 1; 55 /* 56 * 为了各函数的统一性,此处也用for循环实现 int lastPos1 = (int) (80 * random()); String lastName = 57 * lastNameArray[lastPos1]; if (lastLen == 2) { int lastPos2 = (int) (80 * 58 * random()); lastName = lastName + lastNameArray[lastPos2]; } 59 */ 60 for (int i = 0; i < lastLen; i++) { 61 int lastPos = (int) (80 * random()); 62 name.append(lastNameArray[lastPos]); 63 } 64 return name.toString(); 65 } 66 67 /** 68 * @description 随机生成5~11位的QQ号。 69 * @return 生成的QQ号。 70 */ 71 public static String getQq() { 72 char[] numArray = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘ }; 73 int qqLen = (int) (7 * random()) + 5; // qq号长度可能为5~11位 74 StringBuilder qq = new StringBuilder(); 75 for (int i = 0; i < qqLen; i++) { 76 int qqPos = (int) (10 * random()); 77 qq.append(numArray[qqPos]); 78 } 79 return qq.toString(); 80 } 81 82 /** 83 * @description 随机选择9种方向之一。 84 * @return 选择的学习方向。 85 */ 86 public static String getMajor() { 87 String[] majorArray = { "css", "js", "android", "ios", "java", "op", "pm", "ui", "qa" };// 共有9种方向 88 int majorPos = (int) (9 * random()); 89 return majorArray[majorPos]; 90 } 91 92 /** 93 * @description 随机生成的入学时间,时间范围在2016.1.1~2017.12.31。 94 * @return 生成的入学时间。 95 */ 96 public static String getEntryTime() { 97 // 先确定2016.1.1和2017.12.31对应的毫秒数,在此范围内生成long随机数,然后根据该随机数生成java.sql.Date,再toString。 98 Calendar calendar = Calendar.getInstance(); 99 calendar.clear(); 100 calendar.set(2016, 0, 1); 101 long minMillis = calendar.getTimeInMillis(); 102 calendar.set(2018, 0, 1); 103 long maxMillis = calendar.getTimeInMillis(); 104 long millis = (long) ((maxMillis - minMillis) * random()) + minMillis; 105 return (new Date(millis)).toString(); 106 } 107 108 /** 109 * @description 随机选择10所学校之一。 110 * @return 选择的学校。 111 */ 112 public static String getSchool() { 113 String[] schoolArray = { "北京大学", "清华大学", "武汉大学", "复旦大学", "浙江大学", "上海交通大学", "南京大学", "中国人民大学", "解放军国防科学技术大学", 114 "吉林大学" }; 115 int schoolPos = (int) (10 * random()); 116 return schoolArray[schoolPos]; 117 } 118 119 /** 120 * @description 随机生成的学号,取值范围在1~2147483647 (int最大正值)。 121 * @return 生成的学号。 122 */ 123 public static int getJnshuId() { 124 return (int) (Integer.MAX_VALUE * random()) + 1; 125 } 126 127 /** 128 * @description 随机生成的日报链接:http://www.jnshu.com/daily/xxxx(int型数字,取值范围:1~2147483647 129 * (int最大正值))。 130 * @return 生成的日报链接。 131 */ 132 public static String getDailyUrl() { 133 return "http://www.jnshu.com/daily/" + getJnshuId(); 134 } 135 136 /** 137 * @description 固定为:好好学习,天天向上! 138 * @return 生成的口号 139 */ 140 public static String getDesire() { 141 return "好好学习,天天向上!"; 142 } 143 144 /** 145 * @description 随机生成师兄姓名,通过调用getName实现。 146 * @return 生成的师兄姓名 147 */ 148 public static String getJnshuBro() { 149 // 插入大量数据时,考虑到效率,此处可能会改为固定姓名。 150 return getName(); 151 } 152 153 /** 154 * @description 在三种途径中选择一个。 155 * @return 选择的了解途径。 156 */ 157 public static String getKnowFrom() { 158 String[] knowFromArray = { "知乎", "朋友推荐", "传单/广告" }; 159 int knowFromPos = (int) (3 * random()); 160 return knowFromArray[knowFromPos]; 161 } 162 }
简单测试插入10条数据的结果如下:
利用Java随机,生成随机学生数据