2013-12-11 56 views
2

任务是编写一个函数,它可以生成给定数量的不大于另一个给定数字的整数。我现在得到的代码如下所示:如何在Scala中生成一个小于数字的随机整数序列?

scala> def lotto(count: Int, max: Int): Seq[Int] = { 
    |  var result = Seq[Int](); 
    |  var x: Int = 0; 
    |  for(x <- 1 to count){ 
    |  result = scala.util.Random.nextInt(max) :+ result 
    |  } 
    | } 
<console>:13: error: value :+ is not a member of Int 
      result = scala.util.Random.nextInt(max) :+ result 
                ^
<console>:12: error: type mismatch; 
found : Unit 
required: Seq[Int] 
      for(x <- 1 to count){ 
       ^

它不能编译,因为你可以看到。有人可以解释这里有什么问题吗?

+1

使用+:,右联合算子。 –

+1

作为一个方面说明,你不需要声明'var x' - '(x < - 1 to count)'里面的'x''是一个_different_'x',它比你声明的那个'_different''x'更小。另外,如果你使用'for' /'yield',你可以把'result'变成'val'。 –

+0

删除'var x:Int = 0;',你不需要声明一个变量,事实上它甚至在循环中都没有使用,就像Daniel说的那样。此外,摆脱分号,你不需要他们在斯卡拉。 – Jesper

回答

6

编译器指出了一些事情。

:+应该适用于result:+Seq上的方法。如此调用它的方式试图在Int上调用它,因为错误说明不存在。简短的故事是交换订单,如下所示。

Scala返回方法中的最后一个值。因此,将result添加到最后作为返回值。

def lotto(count: Int, max: Int): Seq[Int] = { 
    var result = Seq[Int](); 
    var x: Int = 0; 
    for(x <- 1 to count){ 
    result = result :+ scala.util.Random.nextInt(max) 
    } 
    result 
} 

运行:

scala> lotto(10, 100) 
res0: Seq[Int] = List(41, 75, 80, 80, 33, 44, 3, 24, 20, 28) 

一个一个可变的理解的更简洁版本是使用fill

Seq.fill(count)((scala.math.random * max).toInt) 

甚至:

Seq.fill(count)(util.Random.nextInt(max)) 
3

更惯用的方式写这篇如下:

def lotto(count: Int, max: Int): Seq[Int] = 
    for (x <- 1 to count) yield scala.util.Random.nextInt(max) 

当你在函数式编程风格的编程,避免可变数据(var)。

相关问题