1. 示例
- 代码
import java.util.Random;
public class Main {
public static void main(String[] args) {
// 创建一个随机数生成器
Random rn = new Random();
int number = 10;
System.out.println(rn);
for (int i = 0; i < number; i++){
// 打印 int 类型的随机数
System.out.println(rn.nextInt());
}
}
}
- 结果
java.util.Random@4554617c
960120466
1299748636
2121114740
-1913697362
-1599398321
328507968
1763093196
628983542
558228813
-1882688907
2. 简单的解释
java.util.Random().nextInt()源码: 会调用next()函数,int类型有4个字节32位,所以next(32)
/**
* Returns the next pseudorandom, uniformly distributed {@code int}
* value from this random number generator's sequence. The general
* contract of {@code nextInt} is that one {@code int} value is
* pseudorandomly generated and returned. All 2<sup>32</sup> possible
* {@code int} values are produced with (approximately) equal probability.
*
* <p>The method {@code nextInt} is implemented by class {@code Random}
* as if by:
* <pre> {@code
* public int nextInt() {
* return next(32);
* }}</pre>
*
* @return the next pseudorandom, uniformly distributed {@code int}
* value from this random number generator's sequence
*/
public int nextInt() {
return next(32);
}
next()源码: 调用了对象AtomicLong,输入bit参数,作用是产生下一个 伪随机数pseudorandom number
/**
* Generates the next pseudorandom number. Subclasses should
* override this, as this is used by all other methods.
*
* <p>The general contract of {@code next} is that it returns an
* {@code int} value and if the argument {@code bits} is between
* {@code 1} and {@code 32} (inclusive), then that many low-order
* bits of the returned value will be (approximately) independently
* chosen bit values, each of which is (approximately) equally
* likely to be {@code 0} or {@code 1}. The method {@code next} is
* implemented by class {@code Random} by atomically updating the seed to
* <pre>{@code (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)}</pre>
* and returning
* <pre>{@code (int)(seed >>> (48 - bits))}.</pre>
*
* This is a linear congruential pseudorandom number generator, as
* defined by D. H. Lehmer and described by Donald E. Knuth in
* <i>The Art of Computer Programming,</i> Volume 3:
* <i>Seminumerical Algorithms</i>, section 3.2.1.
*
* @param bits random bits
* @return the next pseudorandom value from this random number
* generator's sequence
* @since 1.1
*/
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
3. Random() 中其它随机数方法
nextByte(): 随机生成下一个bytes
/**
* Generates random bytes and places them into a user-supplied
* byte array. The number of random bytes produced is equal to
* the length of the byte array.
*
* <p>The method {@code nextBytes} is implemented by class {@code Random}
* as if by:
* <pre> {@code
* public void nextBytes(byte[] bytes) {
* for (int i = 0; i < bytes.length; )
* for (int rnd = nextInt(), n = Math.min(bytes.length - i, 4);
* n-- > 0; rnd >>= 8)
* bytes[i++] = (byte)rnd;
* }}</pre>
*
* @param bytes the byte array to fill with random bytes
* @throws NullPointerException if the byte array is null
* @since 1.1
*/
public void nextBytes(byte[] bytes) {
for (int i = 0, len = bytes.length; i < len; )
for (int rnd = nextInt(),
n = Math.min(len - i, Integer.SIZE/Byte.SIZE);
n-- > 0; rnd >>= Byte.SIZE)
bytes[i++] = (byte)rnd;
}
nextLong(): 随机生成一个长整型数值
/**
* Returns the next pseudorandom, uniformly distributed {@code long}
* value from this random number generator's sequence. The general
* contract of {@code nextLong} is that one {@code long} value is
* pseudorandomly generated and returned.
*
* <p>The method {@code nextLong} is implemented by class {@code Random}
* as if by:
* <pre> {@code
* public long nextLong() {
* return ((long)next(32) << 32) + next(32);
* }}</pre>
*
* Because class {@code Random} uses a seed with only 48 bits,
* this algorithm will not return all possible {@code long} values.
*
* @return the next pseudorandom, uniformly distributed {@code long}
* value from this random number generator's sequence
*/
public long nextLong() {
// it's okay that the bottom word remains signed.
return ((long)(next(32)) << 32) + next(32);
}
- …
// 下一个 bool 型
public boolean nextBoolean() {
return next(1) != 0;
}
// 下一个 float 型
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}
// 下一个 double 型
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT;
}
该博客围绕Java的Random类展开,给出示例代码及结果,对源码进行简单解释,指出其会调用相关函数产生伪随机数。还介绍了Random类中其他随机数方法,如随机生成下一个数、长整型数值等,未涉及未使用的操作。
2132

被折叠的 条评论
为什么被折叠?



