如何在Scala中生成一个小于数字的随机整数序列?

时间:2013-12-11 18:58:33

标签: 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){
                 ^

它没有编译,你可以看到。有人可以解释一下这里有什么问题吗?

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:3)

更为惯用的方式是:

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

当您使用函数式编程样式编程时,请避免使用可变数据(var)。