1、方法 1(数据类型)(最小值+Math.random()*(最大值-最小值+1)例:(int)(1+Math.random()*(10-1+1)从 1 到 10 的 int 型随数方法 2获得随机数for (int i=0;i= 0) sb.append(generateZeroString(fixdlenth - strNum.length(); else throw new RuntimeException(“将数字“ + num + “转化为长度为“ + fixdlenth + “的字符串发生异常!“);sb.append(strNum);return sb.toString();pub
2、lic static String toFixdLengthString(int num, int fixdlenth) StringBuffer sb = new StringBuffer();String strNum = String.valueOf(num);if (fixdlenth - strNum.length() = 0) sb.append(generateZeroString(fixdlenth - strNum.length(); else throw new RuntimeException(“将数字“ + num + “转化为长度为“ + fixdlenth + “的
3、字符串发生异常!“);sb.append(strNum);return sb.toString();public static void main(String args) System.out.println(generateString(15);System.out.println(generateMixString(15);System.out.println(generateLowerString(15);System.out.println(generateUpperString(15);System.out.println(generateZeroString(15);System
4、.out.println(toFixdLengthString(123, 15);System.out.println(toFixdLengthString(123L, 15);运行结果:vWMBPiNbzfGCpHG23hyraHdJkKPwMvtigowetbwkm1ndeBPZ1KNEJPHB115N000000000000000000000000000123000000000000123Process finished with exit code 0六、总结1、随机数很常用,在 Java 有三种产生方式,以 Random 随机数的使用最为复杂。2、Random 类对象有是否带种子之分
5、,带种子的只要种子相同,多次运行,生成随机数的结果总是那样。3、带种子随机数的带种子的对象创建方式有两种,效果一样。但是带种子的随机数用处似乎不大。4、Random 的功能涵盖了 Math.random()的功能。5、可以通过随机数去做实现随机字符串等复杂的随机数据。6、不要研究不重复的随机数,意义不大。在 Java 中我们可以使用 java.util.Random 类来产生一个随机数发生器。它有两种形式的构造函数,分别是 Random()和 Random(long seed)。Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,Random(l
6、ong seed)使用指定的 seed 作为发生器的种子。随机数发生器(Random)对象产生以后,通过调用不同的 method:nextInt()、nextLong()、nextFloat()、nextDouble()等获得不同类型随机数。1生成随机数Random random = new Random();Random random = new Random(100);/指定种子数 100random 调用不同的方法,获得随机数。如果 2 个 Random 对象使用相同的种子(比如都是 100),并且以相同的顺序调用相同的函数,那它们返回值完全相同。如下面代码中两个 Random 对象的输
7、出完全相同import java.util.*;class TestRandom public static void main(String args) Random random1 = new Random(100);System.out.println(random1.nextInt();System.out.println(random1.nextFloat();System.out.println(random1.nextBoolean();Random random2 = new Random(100);System.out.println(random2.nextInt();Sy
8、stem.out.println(random2.nextFloat();System.out.println(random2.nextBoolean();2指定范围内的随机数随机数控制在某个范围内,使用模数运算符%import java.util.*;class TestRandom public static void main(String args) Random random = new Random();for(int i = 0; i 获取指定范围内的不重复随机数import java.util.*;class TestRandom public static void main
9、(String args) int intRet = new int6;int intRd = 0; /存放随机数int count = 0; /记录生成的随机数个数int flag = 0; /是否已经生成过标志while(count“+intRett);Java 中的随机数是否可以重复?Java 中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试。1.测试一: 使用不带参数的 Random()构造函数public class RandomTest public static void main(String args) java.util.Random r=new
10、java.util.Random();for(int i=0;i10;i+)System.out.println(r.nextInt();程序运行结果:-1761145445-1070533012216216989-910884656-1408725314-10918028701681403823-1099867456347034376-1277853157再次运行该程序:-169416241220377062-1140589550-1364404766-10881167562134626361-5460497281132916742-15223197211787867608从上面的测试我们可
11、以看出,使用不带参数的 Random()构造函数产生的随机数不会重复。那么,什么情况下 Java 会产生重复的随机数呢?且看下面的测试。2. 测试二:为 Random 设置种子数public class RandomTest_Repeat public static void main(String args) java.util.Random r=new java.util.Random(10);for(int i=0;i10;i+)System.out.println(r.nextInt();无论程序运行多少次,其结果总是:-11577930701913984760110725458617
12、73446580254270492-140806438410484755941581279777-7782093331532292428甚至在不同的机器上测试,测试结果也不会改变!3.原因分析:(1) 首先请打开 Java Doc,我们会看到 Random 类的说明:此类的实例用于生成伪随机数流,此类使用 48 位的种子,该种子可以使用线性同余公式对其进行修改(请参阅 Donald Knuth 的The Art of Computer Programming, Volume 2,第 3.2.1 节)。如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并
13、返回相同的数字序列。为了保证实现这种特性,我们为类 Random 指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。Java Doc 对 Random 类已经解释得非常明白,我们的测试也验证了这一点。(2) 如果没有提供种子数,Random 实例的种子数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开 JDK 的源代码,我们可以非常明确地看到这一点。public Random() this
14、(System.currentTimeMillis(); 4. 结论:通过上面的测试和分析,我们会对 Random 类有较为深刻的理解。同时,我觉得,通过阅读 Java Doc 的 API 文档,可以很好地提高我们的 Java 编程能力,做到“知其然”;一旦遇到费解的问题,不妨打开 Java 的源代码,这样我们就能做到“知其所以然”。-java 中一般有两种随机数,一个是 Math 中 random()方法,一个是 Random 类。一、Math.random()随即生成 0x1 的小数。实例:如何写,生成随机生成出 0100 中的其中一个数呢?Math.random()返回的只是从 0 到
15、1 之间的小数,如果要 50 到 100,就先放大 50 倍,即 0 到 50 之间,这里还是小数,如果要整数,就强制转换 int,然后再加上 50 即为50100.最终代码:(int)(Math.random()*50) + 50二、Random 类Random random = new Random();/默认构造方法Random random = new Random(1000);/指定种子数字在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。相同种子数的 Random 对象,相同次数生成的随机数字是完全相同的。也就是说,两个
16、种子数相同的 Random 对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。2 、Random 类中的常用方法Random 类中的方法比较简单,每个方法的功能也很容易理解。需要说明的是,Random 类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。下面对这些方法做一下基本的介绍:a 、public boolean nextBoolean()该方法的作用是生成一个随机的 boolean 值,生成 true 和 false 的值几率相等,也就是都是 50%的几率。b 、public double nextDouble()该方法的作用是生成一个随
17、机的 double 值,数值介于0,1.0)之间,这里中括号代表包含区间端点,小括号代表不包含区间端点,也就是 0 到 1 之间的随机小数,包含 0 而不包含1.0。c 、public int nextInt()该方法的作用是生成一个随机的 int 值,该值介于 int 的区间,也就是-2 的 31 次方到 2的 31 次方-1 之间。如果需要生成指定区间的 int 值,则需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。d 、public int nextInt(int n)该方法的作用是生成一个随机的 int 值,该值介于0,n)的区间,也就是 0 到 n 之间的随机int 值,
18、包含 0 而不包含 n。如果想生成指定区间的 int 值,也需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。e 、public void setSeed(long seed)该方法的作用是重新设置 Random 对象中的种子数。设置完种子数以后的 Random 对象和相同种子数使用 new 关键字创建出的 Random 对象相同。3 、Random 类使用示例使用 Random 类,一般是生成指定区间的随机数字,下面就一一介绍如何生成对应区间的随机数字。以下生成随机数的代码均使用以下 Random 对象 r 进行生成:Random r = new Random();a 、生成0,1
19、.0)区间的小数double d1 = r.nextDouble();直接使用 nextDouble 方法获得。b、生成0,5.0)区间的小数double d2 = r.nextDouble() * 5;因为 nextDouble 方法生成的数字区间是0,1.0),将该区间扩大 5 倍即是要求的区间。同理,生成0,d)区间的随机小数,d 为任意正的小数,则只需要将 nextDouble 方法的返回值乘以 d 即可。c、生成1,2.5)区间的小数 n1,n2double d3 = r.nextDouble() * 1.5 + 1;【也就是 r.nextDouble() * (n2-n1)+n1】
20、生成1,2.5)区间的随机小数,则只需要首先生成0,1.5)区间的随机数字,然后将生成的随机数区间加 1 即可。同理,生成任意非从 0 开始的小数区间d1,d2)范围的随机数字(其中 d1 不等于 0),则只需要首先生成0,d2-d1)区间的随机数字,然后将生成的随机数字区间加上 d1 即可。d、生成任意整数int n1 = r.nextInt();直接使用 nextInt 方法即可。e、生成0,10)区间的整数int n2 = r.nextInt(10);n2 = Math.abs(r.nextInt() % 10);以上两行代码均可生成0,10)区间的整数。第一种实现使用 Random 类
21、中的 nextInt(int n)方法直接实现。第二种实现中,首先调用 nextInt()方法生成一个任意的 int 数字,该数字和 10 取余以后生成的数字区间为(-10,10),因为按照数学上的规定余数的绝对值小于除数,然后再对该区间求绝对值,则得到的区间就是0,10)了。同理,生成任意0,n)区间的随机整数,都可以使用如下代码:int n2 = r.nextInt(n);n2 = Math.abs(r.nextInt() % n);f、生成0,10区间的整数int n3 = r.nextInt(11);n3 = Math.abs(r.nextInt() % 11);相对于整数区间,0,10区间和0,11)区间等价,所以即生成0,11)区间的整数。g、生成-3,15)区间的整数int n4 = r.nextInt(18) - 3; 【也就是 r.nextInt() * (n2-n1)+n1】 n1 是个负数n4 = Math.abs(r.nextInt() % 18) - 3; 生成非从 0 开始区间的随机整数,可以参看上面非从 0 开始的小数区间实现原理的说明。