实现java.util.Random.nextInt

前端之家收集整理的这篇文章主要介绍了实现java.util.Random.nextInt前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
函数java.util.Random.它返回一个均匀分布在0和给定n之间的伪随机int.不幸的是我没有得到它.
public int nextInt(int n) {
    if (n <= 0)
        throw new IllegalArgumentException("n must be positive");

    if ((n & -n) == n)  // i.e.,n is a power of 2
        return (int)((n * (long)next(31)) >> 31);

    int bits,val;
    do {
        bits = next(31);
        val = bits % n;
    } while (bits - val + (n-1) < 0);
    return val;
}

我的问题是:

>为什么要特别处理n是两个权力的情况?只是为了表演吗?
为什么要拒​​绝比特数val(n-1)< 0?

解决方法

接下来生成随机位.

>当n为2的幂时,可以通过产生随机比特来产生该范围内的随机整数(我假定始终生成31并抛出一些用于重现性).这个代码路径比较简单,我想这是一个比较常用的例子,所以在这种情况下,值得一个特殊的“快速路径”.>当n不是2的幂时,它会将数字丢弃在范围的“顶”,使得随机数均匀分布.例如.想象我们有n = 3,想象我们使用3位而不是31位.所以位是从0到7之间随机产生的数字.那么你可以在那里生成一个公平的随机数吗?答案:如果位为6或7,我们将其丢弃并生成一个新的.

猜你在找的Java相关文章