java - 生成一个范围内的随机数。无溢出。 java 语

标签 java random

请不要将其视为以下内容的重复项而将其忽略: How to generate random positive and negative numbers in java

我需要使用带有种子的随机数生成器。所以,我使用了java.util.Randomconstructor这需要一颗种子。

Random random = new Random(System.currentTimeMillis());

然后我使用了上面线程中给出的解决方案

int randomValue = random.nextInt(max - min + 1) + min;

但是,上述解决方案的问题是,如果 min 是一个很大的负数,max 是一个很大的正数,那么 (max - min + 1) 就会导致溢出。

应该有更好的解决方案。谁能指点我一下。

谢谢!

最佳答案

如何使用BigInteger来避免int溢出。您也可以使用

new BigInteger(int numBits, Random rnd)

创建一些具有随机位的BigInteger(最多使用numBits指定的位)。

因此,只需计算您需要多少位(range.bitLength() 可能有用)检查随机值是否在指定范围内,因此如果值再次大于范围随机,如果一切都是OK 返回增加 min 的随机值。

这是一些代码示例

public static int myRandom(int min, int max, Random r){
    if (max <= min)
        throw new RuntimeException("max value must be greater than min value: max="+max +", min="+min);

    BigInteger maxB = BigInteger.valueOf(max);
    BigInteger minB = BigInteger.valueOf(min);

    BigInteger range = maxB.subtract(minB);
    do{
        BigInteger result = new BigInteger(range.bitLength(), r);
        if (result.compareTo(range)<=0)
            return result.add(minB).intValueExact();
    }while(true);
}

关于java - 生成一个范围内的随机数。无溢出。 java 语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884083/

相关文章:

java - 打印图形顶点和边缘源/目标 - JGraphT

java - 如何在CameraSource上放置一个图标?

启动 Eclipse 时出现 java.lang.ClassNotFoundException

java - 我应该在循环之前还是循环中创建对象 "Random r"

Java 游戏 - 如何使用 Arraylist 添加敌人?

python - 根据文件中的条件随机抽取文件样本

java opencv错误内存不足且断言失败

java - : Tomcat only OR Apache Server + Tomcat?配置哪个好

c++ - 如何确保 std::random_shuffle 总是产生不同的结果?

javascript - 根据字符串参数生成相同的随机数