今天我用Hadoop实现随机生成一个很大的矩阵,可是好多行是一样的,郁闷,查看了JDK的API后才知道了其中的原委,现在和大家分享一下。
Java随机数产生可以通过Java.util.Random来实现。
Random类有两个方法构造方法:
1. Random(long)该构造函数中的参数充当伪随机的种子,我们可以自由设置;
2. Random()该构造方法没有参数,其中的种子是通过System.currentTimeMills()获得;
对于调用Random()方法在单线乘或多线程程序中还没问题,但是在分布式系统中就会出现问题,因为两个进程可能在同一时刻调用(这个是相当有可能的),那么他们生成的随机数序列就会一样。
改正后,我将随机数生成器种子设置为临时的任务编号的哈希值和系统当前时间的和,这样就不去造成种子一样的情况了。
rand = new Random(System.currentTimeMillis() + context.getJobID().hashCode() + context.getTaskAttemptID().hashCode());