我正在使用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的结果很好,它让我不在循环中
我是否遗漏了使数学库有效的内容?我该如何解决随机问题?
答案 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(不包括)之前给出一个双倍值!