加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

实现java.util.Random.nextInt

发布时间:2020-12-15 00:48:35 所属栏目:Java 来源:网络整理
导读:此函数为 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
此函数为 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,我们将其丢弃并生成一个新的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读