math.random总是给出0结果

时间:2015-08-26 19:11:00

标签: java random

我正在使用Ubuntu 14.04.3 LTS,我正在从书中学习Java。我尝试用Ubuntu终端关注本书的一个例子,我正在使用Sublime Text。这是代码

import java.util.Scanner;

public class RepeatAdditionQuiz{
    public static void main(String[] args){
        int number1 = (int)(Math.random()%10);
        int number2 = (int)(Math.random()%10);

        Scanner input = new Scanner(System.in);

        System.out.print(
            "What is "+number1+" + "+number2+"?");
        int answer = input.nextInt();

        while(number1+number2 != answer){
            System.out.print("Wrong answer. Try again. What is "
                 +number1+" + "+number2+"? ");
            answer = input.nextInt();
        }
        System.out.println("You got it!");
    }
}

但问题是,当我编译并执行它时。它给了我结果

  

什么是0 + 0?_

每一次。它假设给我一个随机数,是的,它可以是0.但我尝试运行它超过10次,它一直给我0 + 0,当它假设从0-9随机。

当我输入0时,0 + 0的结果很好,它让我不在循环中

我是否遗漏了使数学库有效的内容?我该如何解决随机问题?

8 个答案:

答案 0 :(得分:7)

Math.random()返回0(包括)和1(不包括)之间的双精度值。它不返回整数值。因此,当您使用Math.random()模10生成的数字时,它将返回相同的double值。最终转换为int使该值始终为0.

运行以下代码以便自己查看:

double random = Math.random();
System.out.println(random); // for example 0.5486395326203879
System.out.println(random % 10); // still 0.5486395326203879
System.out.println((int) (random % 10)); // outputs 0

您真正想要的是使用Random对象并使用Random.nextInt(bound)。要获得0到9之间的随机整数,可以使用:

Random random = new Random();
int value = random.nextInt(10);

答案 1 :(得分:2)

Math.random();

返回带有正号的double值,大于或等于0.0且小于1.0。

这就是问题所在。然后你需要乘以10,所以你得到一个0到10之间的数字,然后你可以转换为int。

答案 2 :(得分:1)

  

public static double random()

     

返回带有正号的double值,大于或等于0.0且小于1.0。返回值是伪随机选择的,具有来自该范围的(近似)均匀分布。

source

它返回一个满足0.0 <= double < 1.0的double,因此取模数将始终为零。我建议java.util.Random课程来达到你的需要。具体来说是Random.nextInt(int)

答案 3 :(得分:1)

Math.random()方法返回从0(包括)到1(不包括)的随机double。执行% 10不会影响此值,但会将其转换为int截断任何小数部分,始终产生0

如果您想要0-9中的随机数,可以将Math.random()乘以10,而不是在除以10时取余数。

或者,您可以创建java.util.Random对象并致电nextInt(10)

答案 4 :(得分:0)

阅读文档:

  

返回带有正号的double值,大于或等于   0.0且小于1.0

因此,您将始终获得少于1,并且转换为int会将其向下舍入为0.例如,使用具有Random方法的nextInt(int max)对象:

Random rd = new Random();
int number1 = rd.nextInt(10);
int number2 = rd.nextInt(10);

答案 5 :(得分:0)

Math.random()返回大于或等于0且小于1的数字。 你要找的是

@Singleton
@Component(module={ApplicationModule.class})
public Interface ApplicationComponent {
    Context context;
}


@Module
public class ApplicationModule {
    @Provides //unscoped, every injection is new instance
    public Context context() {
        return context;   
    }

    @Provides
    @Singleton //scoped, one instance per component
    public Something something() {
        return new Something();
    }
}

 int number1 = (int)(Math.random()*10);
 int number2 = (int)(Math.random()*10);

此外,要从给定范围获取随机数,请将其用于Math.random()

 Random rand = new Random();
 int number1 = rand.nextInt(10);
 int number2 = rand.nextInt(10);

和random.nextInt()

int number 3 = min + (int)(Math.random() * ((max - min) + 1))

答案 6 :(得分:0)

Math.random()方法返回介于0和1之间的Double值,因此您永远不会得到大于或等于1的数字,您将获得一个可能为0的值,但永远不会为1.并且当您从这个值超过10的残差,你将得到一个0结果。

Math.random() % 10将始终为0,因为随机方法会为您提供0 <= value < 1,而当% 10操作发生时,您将获得0。

Check here for more details(oracle文档)

答案 7 :(得分:-1)

Math.random在0(incl。) - 1(不包括)之前给出一个双倍值!