在Java中如何生成一个介于最小值和最大值之间的随机整数?

49

有什么方法可以返回一个介于最小值和最大值之间的随机整数吗?或者这样的方法不存在吗?

我想要的是像这样的东西:

NAMEOFMETHOD (min, max) 

(其中min和max是int),返回类似于这样的内容:

8

(随机)

如果确实存在这样的方法,请在您的答案中提供相关文档链接。

谢谢。


更新

尝试实现完整的解决方案,但是我收到以下错误消息:

class TestR
{
    public static void main (String[]arg) 
    {   
        Random random = new Random() ;
        int randomNumber = random.nextInt(5) + 2;
        System.out.println (randomNumber) ; 
    } 
} 

我仍然从编译器中得到相同的错误:

TestR.java:5: cannot find symbol
symbol  : class Random
location: class TestR
        Random random = new Random() ;
        ^
TestR.java:5: cannot find symbol
symbol  : class Random
location: class TestR
        Random random = new Random() ;
                            ^
TestR.java:6: operator + cannot be applied to Random.nextInt,int
        int randomNumber = random.nextInt(5) + 2;
                                         ^
TestR.java:6: incompatible types
found   : <nulltype>
required: int
        int randomNumber = random.nextInt(5) + 2;
                                             ^
4 errors
这里出了什么问题?

你是否忘记声明 random 并将一个新的 java.util.Random 实例分配给它了? - MAK
你能解释一下如何做到这一点吗? - David
你是否声明了java.util.Random的导入语句? - Shashi
8个回答

147

在应用程序启动时构建一个随机对象:

Random random = new Random();

然后使用Random.nextInt(int)

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

请注意,下限和上限都是包含在内的。


2
David,你需要先实例化它。Random random = new Random(); 这仍然只是Java代码,没有任何魔法手段 ;) - BalusC
2
确保只实例化一次Random对象并重复使用它。不要为每次调用函数创建新的Random对象。 - Mark Byers
4
你漏掉了 import java.util.Random; - Mark Byers
@MarkByers,“只实例化一次随机对象并重复使用”是一个内存问题吗?还是它会影响返回的值?我在这个主题上找不到其他任何东西(除了另一个人也说了,但没有解释为什么)。 - ataulm
1
在旧版本的Java中,创建多个Random对象不能保证随机性。 "在同一毫秒内创建的两个Random对象将具有相同的随机数序列。"(来源)在新版本中,这可能是可以的,但我在三年前写下我的评论时并不知道。 - Mark Byers
显示剩余7条评论

19
您可以使用Random.nextInt(n)方法。此方法返回 [0,n) 中的随机整数。将 max-min+1 替换为 n,将 min 加到答案中即可得到所需范围内的值。

我更新了问题,并附上了出现错误的信息,但是出了什么问题呢? - David

10
public static int random_int(int Min, int Max)
{
     return (int) (Math.random()*(Max-Min))+Min;
}

random_int(5, 9); // For example

你的算法是随机 x * 正数 + 正数。如何确保结果始终在最大值和最小值之间? - Ruben
1
随机数在0和1之间。做数学运算。 - Pablo Pazos
2
请注意,此答案中下限包含在内,但上限不包含。如果您希望两者都包含,请使用以下代码: return (int) (Math.random()*(Max-Min + 1))+Min; - Synn

4
由于上述解决方案未考虑到当“min”为负时执行“max-min”可能会溢出的情况,因此这里提供另一种解决方案(类似于kerouac的解决方案)。
public static int getRandom(int min, int max) {
    if (min > max) {
        throw new IllegalArgumentException("Min " + min + " greater than max " + max);
    }      
    return (int) ( (long) min + Math.random() * ((long)max - min + 1));
}

即使您使用以下方式调用,它也可以正常工作:

getRandom(Integer.MIN_VALUE, Integer.MAX_VALUE) 

4

使用 Java 7 或更高版本,您可以使用

ThreadLocalRandom.current().nextInt(int origin, int bound)

Javadoc: ThreadLocalRandom.nextInt 的翻译:

1

正如接受的答案所建议的那样,使用Random类是正确的方法,但如果您不想创建新的Random对象,则以下是一种不太直观的正确方法:

min + (int) (Math.random() * (max - min + 1));

-3

这将生成一个大小为psize的随机整数

public static Integer getRandom(Integer pSize) {

    if(pSize<=0) {
        return null;
    }
    Double min_d = Math.pow(10, pSize.doubleValue()-1D);
    Double max_d = (Math.pow(10, (pSize).doubleValue()))-1D;
    int min = min_d.intValue();
    int max = max_d.intValue();
    return RAND.nextInt(max-min) + min;
}

2
似乎这是一种复杂的方式来实现可以在一行代码中完成的事情。请在以后使用代码格式。 - Andrew Thompson

-6

导入 java.util.Random 包;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接