Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试。
1.测试一: 使用不带参数的Random()构造函数
/**
* @author Carl Wu
*/
public class RandomTest {
public static void main(String[] args) {
java.util.Random r=new java.util.Random();
for(int i=0;i<10;i++){
System.out.println(r.nextInt());
}
}
}
程序运行结果:
-1761145445
-1070533012
216216989
-910884656
-1408725314
-1091802870
1681403823
-1099867456
347034376
-1277853157
再次运行该程序:
-169416241
220377062
-1140589550
-1364404766
-1088116756
2134626361
-546049728
1132916742
-1522319721
1787867608
从上面的测试我们可以看出,使用不带参数的Random()构造函数产生的随机数不会重复。那么,什么情况下Java会产生重复的随机数呢?且看下面的测试。
2. 测试二:为Random设置种子数
/**
* @author Carl Wu
*/
public class RandomTest_Repeat {
/**
* @param args
*/
public static void main(String[] args) {
java.util.Random r=new java.util.Random(10);
for(int i=0;i<10;i++){
System.out.println(r.nextInt());
}
}
}
无论程序运行多少次,其结果总是:
-1157793070
1913984760
1107254586
1773446580
254270492
-1408064384
1048475594
1581279777
-778209333
1532292428
甚至在不同的机器上测试,测试结果也不会改变!
3.原因分析:
(1) 首先请打开Java Doc,我们会看到Random类的说明:
此类的实例用于生成伪随机数流,此类使用 48 位的种子,该种子可以使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。
如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证实现这种特性,我们为类Random指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。
Java Doc对Random类已经解释得非常明白,我们的测试也验证了这一点。
(2) 如果没有提供种子数,Random实例的种子数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开JDK的源代码,我们可以非常明确地看到这一点。
/**
* Creates a new random number generator. Its seed is initialized to
* a value based on the current time:
*
* public Random() { this(System.currentTimeMillis()); }
*
* @see java.lang.System#currentTimeMillis()
*/
public Random() { this(System.currentTimeMillis()); }
4. 结论:
通过上面的测试和分析,我们会对Random类有较为深刻的理解。同时,我觉得,通过阅读Java Doc的API文档,可以很好地提高我们的Java编程能力,做到“知其然”;一旦遇到费解的问题,不妨打开Java的源代码,这样我们就能做到“知其所以然”。
随机产生3个67~295的整数并找出数值居中的数并输出中间的数,例如:100,225和200,输出200
要随机产生某个范围内的整数,用 java.util.Random 类的 nextInt( ) 最简洁。
nextInt( ) 能接受一个整数作为它所产生的随机整数的上限。但下限总是零,不能更改,所以若要达到非零下限的效果,必须把上限减去下限的结果传给 nextInt( ),然后把下限加入 nextInt( ) 返回的整数。
把随机数采集到数组里,然后用同样是在 java.util 包里的 Arrays.sort( ) 做数组排序后,居中数近在眼前。
import java.util.*;
class C {
public static void main( String[ ] args ) {
Random rand = new Random( );
int[ ] trio = new int[ 3 ];
System.out.println( “Three random integers in the range of [67, 295):” );
for( int i = 0; i < 3; ++i ) {
trio[ i ] = rand.nextInt( 295 - 67 ) + 67;
System.out.println( trio[ i ] );
}
Arrays.sort( trio );
System.out.println( "\nMedian:\n" + trio[ 1 ] );
}
}
整理自网络
Sorry, the comment form is closed at this time.
No comments yet.