• Geek_ae270e
    2019-11-12
    老师,为何Math.random()*(rangeEnd - rangeStart) + rangeStart的值阈是 [rangeStart, rangeEnd)呢?你说的那个公式我还是不太理解

    作者回复: Math.random()是[0, 1)

    所以Math.random()*(rangeEnd - rangeStart) + rangeStart就是

    rangeStart + [0, 1) * (rangeEnd - rangeStart)

    所以最小值就是0的时候,是rangeStart,最大值不包含为1的时候,就是rangeEnd

    所以是 [rangeStart, rangeEnd)


    Math.random的注释:
         * Returns a {@code double} value with a positive sign, greater
         * than or equal to {@code 0.0} and less than {@code 1.0}.

    
     2
  • Geek_648cff
    2020-01-05
    老师好,我不太理解为什么在生成rangeStart到rangeEnd之间的随机数时,为什么不用Math.random()*(rangeEnd - rangeStart) + rangeStart这个公式呀?这个公式看上去很简洁直接,也好理解。

    在您的讲课视频里,您先用Math.random()产生的随机数乘以一个很大的数字,然后再用这个成倍放大过的随机数和(rangeEnd - rangeStart) 的结果做取模运算,然后再把结果加上rangeStart。我不太理解,在这里为什么要用到取模运算呢?取模运算的意义在哪里呢?为什么不直接用Math.random()*(rangeEnd - rangeStart) + rangeStart生成想要区间内的随机数呢?

    谢谢老师的解答,辛苦老师啦^_^
    展开

    作者回复: 可以,稍微简单点可以这样写

    (int)(Math.random(rangeEnd - rangeStart) + 0.5) + rangeStart,这个结果范围会是 [rangeStart, rangeEnd)

    
     1
  • 隰有荷
    2020-01-13
    感觉这个随机数的写法不是很好理解

    作者回复:
    这里为了使用更多的操作符,确实搞得有点复杂。可以参考这节课里别的同学的提问和我的回答。有些别的写法更简单。

    
    
  • slssdhs
    2020-01-11
    老师你好 我查了一下关于java生成指定范围的随机数的文章 有提到这样一种方法
     import java.util.concurrent.ThreadLocalRandom;
    然后使用
    int random_number = ThreadLocalRandom.current().nextInt(MIN, MAX+1);
    来获得对应范围之内的int型的随机值。
    请问老师没有选择这么讲是为什么呢 我觉得这样好理解一些啊 是因为涉及到的其他部分的知识太多了吗?(我有python的基础 可能理解起来轻松一些 是这样吗)
    展开

    作者回复:
    第一篇还没介绍方法,类这些概念,甚至import和包都没介绍,所以用了尽量少的语法点,完成一个基本的功能,介绍完Java中的语句。

    ThreadLocalRandom在concurrent包里,更主要的是保证线程之间的随机性,也就是说每个线程独占一个random seed,这里涉及到的知识点就更多liao……

    这个实现确实啰嗦,你有编程基础,可以想想有没有别的办法,可以既不引入新的语法和类,又可以让代码更简洁易懂~

    
    
  • 东方未晞
    2019-12-27
    如果要保证不取到两端的值,是不是要在生成随机数+初始值后再加个1才好。

    作者回复: 后面猜数字游戏里为了取到边界值,是给end加了1的。

    
    
  • 悦月
    2019-12-20
    老师好,这里写小于0.5,为什么可以生成一个比0.5 大的数?

    作者回复: 可以把代码贴出来看看,更能明确问题

     1
    
  • Geek_421d56
    2019-10-21
    老师,生成rangeStart到rangeEnd之间的随机数不能直接Math.random()*(rangeEnd - rangeStart) + rangeStart吗?

    作者回复:
    可以,只要明白Math.random()*(rangeEnd - rangeStart) + rangeStart的值阈是 [rangeStart, rangeEnd)就可以

    
    
  • Geek_58b038
    2019-09-03
    请问一下老师:
            double randNum=0;
            {
                while(randNum<0.5){
                    randNum = Math.random();
                    System.out.println(randNum);
                }

            }
            System.out.println(randNum);
    这个时候为什么在代码块之外的randNum的值依旧跟执行while语句时候最后赋值的randNum值一样呢? 这时候代码块之外的randNum的值不应该是0吗?
       
    展开

    作者回复:
    randNum就像是一张有名字的纸条。使用这个名字,既可以获取当前纸条上的内容(比如 double a = randNum + 1),也可以修改纸条上的内容,比如randNum = Math.random();。

    这个纸条的官方学名,就叫做变量。

    就好像我们做物理应用题一样,开始设:x = 9,那么x就是一个符号,它的值可以被修改。

     2
    
  • Error
    2019-05-29
    想请问老师,在IDEA中,写代码的时候鼠标的光标怎么快速跨过一个 () 或者 {} 到下一个代码块前面。
    如 for (int i= | 0; i<=10; i++|) {

    }
    第一个光标 | 怎么跳出这个分号,第二个光标跳出 )

    作者回复: IntelliJ 本身对这种光标的操作快捷键比较少. 但是IntelliJ很机智的有一个支持Vim快捷键的编辑器IdeaVim, 如果你对这种光标操作快捷键有追求的话, 建议试试看.

    安装的方式就是在Settings里面, Plugins, Marketplace, 搜索IdeaVim.

     1
    
我们在线,来聊聊吧