我想隨機隨機播放一個scala列表。Scala隨機播放列表並重復它
我知道我可以通過使用scala.util.Random.shuffle
但在這裏通過調用這個我總是會得到一套新名單的做到這一點。我真正想要的是,在某些情況下,我希望洗牌總是給我相同的輸出。那麼我怎麼能做到這一點?
基本上我想要做的是隨機隨機洗牌,然後以相同的順序重複。我第一次想要隨機生成列表,然後基於某個參數重複相同的混洗。
我想隨機隨機播放一個scala列表。Scala隨機播放列表並重復它
我知道我可以通過使用scala.util.Random.shuffle
但在這裏通過調用這個我總是會得到一套新名單的做到這一點。我真正想要的是,在某些情況下,我希望洗牌總是給我相同的輸出。那麼我怎麼能做到這一點?
基本上我想要做的是隨機隨機洗牌,然後以相同的順序重複。我第一次想要隨機生成列表,然後基於某個參數重複相同的混洗。
設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你想它映射
使用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)
如果我先使用shuffle而不設定種子,我可以知道shuffle的種子嗎? – Sidhant
如果我一直調用util.Random.shuffle(Seq(1,2,3,4)),我總是得到一個不同的集合。我需要每次都得到相同的設置。 – Sidhant
在調用shuffle()後,沒有用於檢索種子狀態的API。要重複之前的洗牌,您必須將種子重置爲與之前洗牌相同的狀態。這意味着當你想重複第一個shuffle時,在第一個shuffle之前使用setSeed(),然後使用相同的種子值使用setSeed()。 – jwvh