为模拟向数据库中大量插入学生数据(注:此处应该用PreparedStatement、batchUpdate等批处理提高效率)的情形,通过Java随机来生成学生数据。
一、要生成的学生数据
students表设计如下:
其中前三项是数据库自动生成的,后面的10项需要程序生成。
>>基于实际要求,插入的Student数据中,major和jnshuId不能同时相同。但由于随机数的不确定性,在程序中限制两个Student的major和jnshuId不同时相同复杂而低效。因此,选择在数据库中将major和jnshuId设为联合唯一性索引,然后在插入数据时忽略重复值。
因此,设计RandomStudent类如下:
通过getStudent方法生成学生数据,其中的各种getXxx方法都是随机生成各种数据的静态方法。
public staticStudent getStudent() {
Student stu= newStudent(getName(), getMajor(), getJnshuId());
stu.setQq(getQq());
stu.setEntryTime(getEntryTime());
stu.setSchool(getSchool());
stu.setDailyUrl(getDailyUrl());
stu.setDesire(getDesire());
stu.setJnshuBro(getJnshuBro());
stu.setKnowFrom(getKnowFrom());returnstu;
}
二、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。<