Scala中两种含随机数的for循环写法的计算差异问询
两种Scala循环写法的计算差异分析
嘿,这个问题问得挺细致的!咱们来好好拆解这两种写法在计算层面的真实区别:
第一种写法:显式存储随机数
val randomNumber = r.nextInt(10) for (i <- 0 to randomNumber) { println(i) }
正如你观察到的,这里的r.nextInt(10)只会被计算一次——在给randomNumber赋值的那一刻,随机数生成器就返回了一个0到9之间的整数,之后整个for循环的范围0 to randomNumber都是基于这个固定值生成的,循环的迭代次数从0到这个固定数,全程不会再调用随机数方法。而且这个randomNumber变量你还能在循环之外继续复用。
第二种写法:匿名使用随机数
for (i <- 0 to r.nextInt(10)) { println(i) }
很多人可能会误以为这里的r.nextInt(10)会在每次循环迭代时都跑一遍,但其实在Scala里,for循环的生成器表达式(也就是0 to r.nextInt(10)这部分)是在循环启动前就完全求值完毕的。也就是说,这个随机数方法同样只会被调用一次,得到一个固定值后生成对应的Range序列,再逐个迭代打印。
核心差异总结
这两种写法在计算效率上几乎没有区别,最大的不同在于:
- 第一种把随机数结果存在了显式变量里,方便后续复用;
- 第二种的随机数结果是临时匿名的,只能用于生成当前循环的范围,循环结束后就无法再访问这个值。
额外提一句:如果是惰性求值的集合(比如Stream),情况可能会有变化,但这里to生成的Range是严格求值的,所以两种写法的随机数调用次数完全一致。
内容的提问来源于stack exchange,提问作者Andrew_256
相关产品推荐
相关产品推荐

