java面试题网站:www.javaoffers.com
takeSample(boolean, sampleNum,seed):该函数是抽取随机数。
前言:很重要,不然你不会理解seed的作用。
用算法进行算出的结果为伪随机数,因为算法是固定的,只是我们在改变其参数而已,要知道在java中的Random类产生的数就是伪随机数,底层有一套自己的算法,该算法依靠seed(种子)参数,如果种子一样得到的结果也一样,而我们通常在开发中大部分是使用 new Random() 方法(另外一个构造方法是:new Random(seed)),此构造没有seed参数,底层代码为:
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
seedUniquifier()这个方法中存在固定的值为: 8682522807148012L * 181783497276652981L
System.nanoTime(): 取出当前的纳秒值机数(重复的概率很小)这个值很关键,因为这个值改变,产生的随机值也在改变(因为算法是固定的)。该值充当了seed参数,
所以Random产生的随机值是伪随机值。真正的随机数比如,水波波纹密度,天空中的风的每分钟风速,即大自然的不受人控制的变化的,
言归正传:
boolean: 该参数对应true和false,分别对应两种算法(两种抽取器),底层代码为:if (withReplacement) { new PartitionwiseSampledRDD[T, T](this, new PoissonSampler[T](fraction), true, seed) } else { new PartitionwiseSampledRDD[T, T](this, new BernoulliSampler[T](fraction), true, seed) } 这两种算法分别为:PoissonSampler 和 BernoulliSampler
sampleNum: 为要随机抽取多少个在Rdd中的元素
seed : 即种子,在算法中充当着随机参数,根据随机参数的不同,最后产生的结果不同,seed参数相同,使用的算法boolean也相同,
则最后的结果也是相同的,所以说takeSample是一个伪随机数。此时你要深刻理解前言所说的。