作者回复: 如果是之前没有编程经验的同学,我是认真的。
编程要培养感觉,看懂学会不等于会用,抄十遍和锻炼身体一样,有一定的重复,才能形成本能。而且,在抄的时候,要一边写一边想为什么。这才是目的。目的是抄几遍之后,自己能够想着写出来,更进一步,可以对其中的代码进行改善。这才是消化吸收的过程。
作者回复: 嗯呐。边界可以特殊处理一下。我记得可以给rangeEnd加1
作者回复:
1)从Java 5开始,Java支持了自动装箱和拆箱(auto boxing, auto unboxing)。意思就是在需要的时候,会把基础类型(boolon,int等)和其对应的封装类型(Boolean,Integer等)自动转换。基础类型是没有任何方法的,就是一个纯粹的数据。不确定你是怎么做信号量的,如果只是使用一个布尔的值,那么这两种是没有区别的,如果要用到一些方法,比如wait之类的,那么其实是使用的Boolean类型的。
2)null是引用的缺省值,不是类型。就好像int的缺省值是0,boolean的缺省值是false。引用可以认为是一种存储对象地址的基础类型,它的缺省值就是null(落到实际内存的存储上,其实就是0,但是因为没有任何一个对象的地址会是0,所以引用对应的内存的值如果是0,那么Java就知道,这个引用其实是空,也就是不指向任何对象)。所有的引用都可以用null赋值,包括你上面提到的String的引用。
作者回复: 100 % 9 = 1
取余数
作者回复: bigRandom本身是个随机数,而且远大于mod
mod是求余数,那么余数必定是在0和mod之间
两个条件放在一起满足,就是一个0到mod的随机数
作者回复: int bigRandom = (int)(Math.random() * rangeEnd * 100); //首先,Math.random()是一个从0到1的数字,所以,肯定要乘以一个大点的整数,才能保证随机性。比如说,如果rangeEnd是60,Math.random()是0.001,那么结果就是0.6了,强转整数就是0了。这个程序这么看可能更好理解:(int)(Math.random() * 100 * rangeEnd),那么Math.random() * 100就是一个从0到100的随机数,再乘以rangeEnd,那么就是一个从0到rangeEnd*100的随机数了。
int unmberToGuess = (bigRandom % mod) + rangeStart; //理解了上面的,下面就好理解了,rangeStart是保证了最小数,bigRandom % mod是让这个从0到rangeEnd*100的随机数变成一个从0到mod的随机数,也就是从0到rangeEnd - rangeStart,两者加在一起就是一个从rangeStart到rangeEnd 的随机数了。
当然这不是唯一的方法,这几行code就是要做到两点:
1:得到一个从rangeStart到rangeEnd的整数
2:这个数足够随机
你可以试着想想别的方法
作者回复:
每个判断都有其作用呀。你可以给个代码,我们来看看这个判断是什么作用。
作者回复: 这个是IntelliJ默认的快捷键,如果你没有改过&&类名输入正确的情况下,最多稍微等等,IntelliJ就能反应过来。
作者回复: 随机数可能是从0到1的double,rangNum*1000是从0到1000的随机数,但是numberToGuess有个最小值的,不能从0开始。
作者回复: scanner相当于是缓存了从命令行输入的字符,然后通过nextXxx去消费这些字符。
nextLine会读取到换行符。但是nextInt会读取到不是数字为止。所以换行符没有被消费。所以下次调用nextLine的时候就会消费这个换行符。就好像人输入了一个空行一样。
解决方法就是用nextLine读取一行,然后用Integer.parseInt把字符串解析成数字
作者回复: 如果猜对了, 会给它赋值,不会用缺省值的
correctGuess = true;
作者回复: 手动点赞👍
作者回复: 刚刚看到,问题审核会需要些时间。能自己解决很棒棒!
问代码相关的问题,建议将相关的代码贴出来。这样会对解决问题有很大帮助。