【问题标题】:Scala Shuffle A List Randomly And repeat itScala随机播放列表并重复
【发布时间】:2017-05-30 07:20:53
【问题描述】:

我想随机打乱一个 scala 列表。

我知道我可以通过使用 scala.util.Random.shuffle 来做到这一点

但是在这里通过调用这个我总是会得到一组新的列表。我真正想要的是,在某些情况下,我希望 shuffle 总是给我相同的输出。那么我该如何实现呢?

基本上我想做的是首先随机打乱一个列表,然后以相同的顺序重复它。我第一次想随机生成列表,然后根据一些参数重复相同的改组。

【问题讨论】:

    标签: scala random shuffle


    【解决方案1】:

    在洗牌之前使用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)
    

    洗牌:1st -> 3rd, 2nd -> 1st, 3rd -> 4th, 4th -> 2nd

    现在我们可以重复同样的随机播放模式。

    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 的种子吗?
    • 如果我一直调用 util.Random.shuffle(Seq(1,2,3,4)) 我总是得到不同的集合。我每次都需要得到相同的设置。
    • 在调用shuffle() 之后没有用于检索种子状态的API。要重复上一次洗牌,您必须将种子重置为与上一次洗牌时相同的状态。这意味着在第一次洗牌之前setSeed(),然后是setSeed(),使用相同的种子值,当你想重复第一次洗牌时。
    【解决方案2】:

    设 a 为种子参数 让 b 成为你想要洗牌的次数

    有两种方法可以做到这一点

    您可以使用scala.util.Random.setSeed(a),其中“a”可以是任何整数,因此在完成 b 次混洗后,您可以再次设置“a”种子,然后您的混洗将与参数“a”的顺序相同

    另一种方法是将List(1,2,3,...a) == 1 to a 洗牌 b 次,将其保存为嵌套列表或向量,然后您可以将其映射到您的可迭代对象

    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)))  
    

    您可以通过映射为您想要随机播放的其他列表使用相同的随机数

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多