2017-05-30 71 views
0

我想隨機隨機播放一個scala列表。Scala隨機播放列表並重復它

我知道我可以通過使用scala.util.Random.shuffle

但在這裏通過調用這個我總是會得到一套新名單的做到這一點。我真正想要的是,在某些情況下,我希望洗牌總是給我相同的輸出。那麼我怎麼能做到這一點?

基本上我想要做的是隨機隨機洗牌,然後以相同的順序重複。我第一次想要隨機生成列表,然後基於某個參數重複相同的混洗。

回答

1

設A爲種子參數 假設B是要洗牌了多少時間

有兩種方法來還挺做到這一點

你可以使用scala.util.Random.setSeed(a)其中「A」可以是任何整數,所以在完成你的洗牌b次後,你可以再次設置'a'種子,然後你的洗牌順序與你的參數'a'相同。

另一種方法是洗牌List(1,2,3,...a) == 1 to a保存爲一個嵌套列表或向量,然後你可以將它映射到你的迭代器

val arr = List(Bob, Knight, John) 
val randomer = (0 to b).map(x => scala.util.Random.shuffle((0 to arr.size)) 

randomer.map(x => x.map(y => arr(y))) 

您可以使用相同的randomer你想它映射

3

使用setSeed()混洗前種子發電機洗牌你其他列表。然後,如果您想重複洗牌,請重複使用種子。

例如:

scala> util.Random.setSeed(41L) // some seed chosen for no particular reason 

scala> util.Random.shuffle(Seq(1,2,3,4)) 
res0: Seq[Int] = List(2, 4, 1, 3) 

那洗牌:1 - >第3,第2 - > 1,第3 - > 4日,4日 - >第二

現在我們可以重複同樣的洗模式。

scala> util.Random.setSeed(41L) // same seed 

scala> util.Random.shuffle(Seq(2,4,1,3)) // result of previous shuffle 
res1: Seq[Int] = List(4, 3, 2, 1) 
+0

如果我先使用shuffle而不設定種子,我可以知道shuffle的種子嗎? – Sidhant

+0

如果我一直調用util.Random.shuffle(Seq(1,2,3,4)),我總是得到一個不同的集合。我需要每次都得到相同的設置。 – Sidhant

+0

在調用shuffle()後,沒有用於檢索種子狀態的API。要重複之前的洗牌,您必須將種子重置爲與之前洗牌相同的狀態。這意味着當你想重複第一個shuffle時,在第一個shuffle之前使用setSeed(),然後使用相同的種子值使用setSeed()。 – jwvh