2014-01-09 59 views
4

如何從列表中返回多個隨機元素。如何從列表中返回多個隨機元素scala

這個問題How to choose a random element from an array in Scala?是指使用:

import scala.util.Random 
val A = Array("please", "help", "me") 
Random.shuffle(A.toList).head 

在我的可變是想我可以創建for循環,並保持在選擇下一個隨機元素(不包括已經選擇了一個),並添加到一個新的名單。在Scala中有更多的慣用/功能方法來實現這一點嗎?

+3

'Random.shuffle(A.toList).take(n)' – senia

+0

「take」使用循環來實現這一點。這可能是由性能原因解釋的。 –

+1

@HappyCoder:是的,'Random.shuffle(A.toIndexedSeq).take(n)'更好。 – senia

回答

12

head方法將返回列表的第一個元素,但take(n)將返回到列表前面的n元素。所以,你得洗名單後,只需使用take

def takeRandomN[A](n: Int, as: List[A]) = 
    scala.util.Random.shuffle(as).take(n) 

如果列表as短於n那麼這將只是洗牌as

+0

只需注意,這對於小列表來說很好,但對於那些想要一個小隨機子集的大列表來說,這可能會非常緩慢。 – FearTheCron

1

更「保守」的變體,不使用mutables/vars。只是爲了練習:

def takeRandomFrom[T](n: Int, list: List[T]): List[T] = { 
    @tailrec 
    def innerTake(n:Int, list: List[T], result: List[T]): List[T] = { 
    if (n == 0 || list.isEmpty) { 
    result 
} else { 
    innerTake(n - 1, list.tail, list.head :: result) 
} 
    } 

    innerTake(n, Random.shuffle(list), Nil) 
} 

takeRandomFrom(2, Array("please", "help", "me").toList) 
相關問題