// P23 (**) Extract a given number of randomly selected elements from a list. // Example: // scala> randomSelect(3, List('a, 'b, 'c, 'd, 'f, 'g, 'h)) // res0: List[Symbol] = List('e, 'd, 'a) // // Hint: Use the answer to P20. object P23 { import P20.removeAt def randomSelect1[A](n: Int, ls: List[A]): List[A] = if (n <= 0) Nil else { val (rest, e) = removeAt((new util.Random).nextInt(ls.length), ls) e :: randomSelect1(n - 1, rest) } // It can be expensive to create a new Random instance every time, so let's // only do it once. def randomSelect[A](n: Int, ls: List[A]): List[A] = { def randomSelectR(n: Int, ls: List[A], r: util.Random): List[A] = if (n <= 0) Nil else { val (rest, e) = removeAt(r.nextInt(ls.length), ls) e :: randomSelectR(n - 1, rest, r) } randomSelectR(n, ls, new util.Random) } }