如何使用Math.random()生成指定范围内的随机数

5

我对Math.random();不是很熟悉,也不知道该如何满足我的条件。我想产生一个介于0和52之间的随机整数,目前这是我设置的代码:

    public class Tester{
    public static void main(String args[]){
        int size=52;
        while(size>0){
            int rando=(int)Math.random()*size;
            size--;
            System.out.println(rando);
        }
    }
}

我的代码在 while 循环的条件满足之前一直输出 0。我想知道如何生成一个介于 0 和 52 之间的随机整数。我知道 Math.random(); 会生成一个 double 类型的数,但我认为类型转换可能有问题。谢谢。

6个回答

7

您只使用了Math.random()。这是一个介于0和1之间的值(不包括1)。 如果您强制转换,它将始终为零。

强制转换整个表达式: (int)(Math.random()*size);

顺便说一下: 由于不包括1,您的区间仅从0到51。

如果您想要0...52作为您的区间,请使用(int)(Math.random()*(size+1));


有没有办法防止 Math.random(); 重复生成已经产生的数字? - Tariq Al-Attrash
不过,您可以将值保存在一个Set中,并测试该值是否已经存在于该集合中。 - osanger

3

在计算过程中,类型转换比乘法优先级更高。由于 Math.random() 返回的是一个范围为 [0.0..1.0) 的双精度浮点数,它将始终被转换为 0,因此将其乘以任何其他 int 的结果显然都将是 0。你可以在进行类型转换之前执行乘法 - ((int)(Math.random()*size)),但实际上最好使用 Random.nextInt(int) 方法。


2

Math.random()返回一个范围为[0,1)的伪随机数。

在以下代码行中:

int rando=(int)Math.random()*size;

这个值被转换为整数,然后乘以大小。

要解决只打印零的问题,您需要添加括号。

int rando = (int) (Math.random()*size);

这将只给你在域[0,51)中的数字。 要解决这个问题:

int rando = (int) (Math.random()* (size + 1);

1

需要使用Math类吗?

找到这个数字的更简单的方法是使用Random类。

示例:

Random randomNumber = new Random ();
System.out.println(randomNumber.nextInt(53));

另请参阅:

Math.random()与Random.nextInt(int)


0

你可以使用其他的代码,例如java.util.Random:

Random r = new Random();
int rando = r.nextInt(53); //inclusive 0 and exclusive 53

在使用Math.random()和你的代码时,你需要在乘法之后进行强制类型转换(像下面这样设置括号):
int rando = (int)(Math.random() * size);

在您的代码中,Math.random() 的返回值首先被强制转换,然后再与 size 参数相乘。由于 Math.random() 返回 0 到 1 之间的 double 数字,因此将其转换为 int 后会返回 0。

0

在编程中,你不能使用Math.random()来生成一个指定范围内的随机整数,如文档所述。
但是你可以使用java.util包中的Random类,并使用方法.nextInt()或更具体地说是.nextInt(int maximum),其中maximum将为53,而不是52,因为如文档所述,该方法是排除上限的。
如果你想要一个特定范围内的数字,比如10到50之间的数字,你可以构建一个像这样的方法:

 private final Random RANDOMISER = new Random();

 private int generateRandomNumber(int from, int to){
  return RANDOMISER.nextInt((to+1)-from)+from;
 }

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