【问题标题】:math.random always give 0 resultmath.random 总是给出 0 结果
【发布时间】:2015-11-20 23:27:31
【问题描述】:

我正在使用 Ubuntu 14.04.3 LTS,并且正在从书中学习 Java。我尝试使用 Ubuntu Terminal 来遵循书中的一个示例,并且我正在使用 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 的结果很好,它让我脱离了循环

我是否错过了一些使数学库正常工作的东西?如何解决随机化问题?

【问题讨论】:

  • 您是否费心阅读文档或使用 Google 查找示例?

标签: java random


【解决方案1】:

Math.random() 返回一个介于 0(包括)和 1(不包括)之间的双精度值。它不返回整数值。因此,当您将Math.random() 产生的数字取模10 时,它返回相同的双精度值。最终转换为 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);

【讨论】:

    【解决方案2】:

    阅读文档:

    返回一个带正号的双精度值,大于或等于 0.0 小于 1.0

    因此,您将始终得到小于 1 的值,而转换为 int 会将其向下舍入为 0。例如,使用具有 nextInt(int max) 方法的 Random 对象:

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

    【讨论】:

    • 为什么要对我投反对票?答案很准确
    【解决方案3】:

    public static double random()

    返回一个带正号的双精度值,大于或等于 0.0 且小于 1.0。返回值是伪随机选择的,从该范围(近似)均匀分布。

    (source)

    它返回一个满足0.0 <= double < 1.0 的双精度数,因此取模总是会产生零。我推荐 java.util.Random 类来实现你所需要的。特别是Random.nextInt(int)

    【讨论】:

      【解决方案4】:

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

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

      或者,您可以创建一个java.util.Random 对象并调用nextInt(10)

      【讨论】:

        【解决方案5】:
        Math.random();
        

        返回一个带正号的双精度值,大于或等于 0.0 且小于 1.0。

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

        【讨论】:

        • 但如果我得到 0.99 并将其乘以 10,我将首先得到 9.99。这就是为什么我说你会得到一个 0 到 10 之间的数字。你同意吗?之后,当您将其转换为 int 时,您将得到一个介于 0 和 9 之间的数字,这样您是对的。
        • 好的,我明白了,我不清楚这就是你的意思
        【解决方案6】:

        Math.random 给出一个介于 0(包括)-1(不包括)之间的双精度值!

        【讨论】:

          【解决方案7】:

          Math.random() 返回一个大于或等于 0 且小于 1 的数字。 您正在寻找的是

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

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

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

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

          对于 random.nextInt()

          int number 4 = random.nextInt(max - min) + min;
          

          【讨论】:

            【解决方案8】:

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

            Math.random() % 10 永远是 0,因为随机方法给你0 <= value < 1,当% 10 操作发生时,你会得到 0。

            Check here for more details(甲骨文文档)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-27
              • 2012-12-31
              • 2022-07-26
              • 1970-01-01
              • 2015-09-29
              • 2020-07-03
              • 1970-01-01
              • 2023-03-21
              相关资源
              最近更新 更多