Поведение перетасовки в Set vs List с помощью scala.util.Random

 scala> Random.shuffle((1 to 10).toSet)
 res10: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

 scala> Random.shuffle((1 to 10).toSet)
 res11: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

 scala> Random.shuffle((1 to 10).toSet)
 res12: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

 scala> Random.shuffle((1 to 10).toList)
 res13: List[Int] = List(3, 9, 8, 5, 7, 6, 10, 2, 1, 4)

 scala> Random.shuffle((1 to 10).toList)
 res14: List[Int] = List(5, 10, 2, 9, 4, 7, 8, 6, 1, 3)

 scala> Random.shuffle((1 to 10).toList)
 res15: List[Int] = List(5, 9, 10, 6, 8, 3, 4, 1, 7, 2)

Так что shuffle может обрабатывать списки просто отлично, но не наборы? Невозможно перетасовать? Почему res10 == res11 == res12?

Ответ 1

Scala наборы не упорядочены (как и математические). Однако они повторяемы, вы просто не можете полагаться на порядок, в котором вы получите элементы. Многие реализации множеств будут перебирать одни и те же элементы в одном и том же порядке, т.е.

scala> Set(1, 2, 3, 4, 5).toList == Set(5, 4, 3, 2, 1).toList
res0: Boolean = true

Это объясняет эффект, который вы видите здесь. Вы никогда не должны полагаться на это, хотя может быть идеальная действительная реализация Set, для которой выше не было.

Ответ 2

Случайное - это "перетасовка" набора; он просто не имеет видимого эффекта, так как наборы не имеют порядка. REPL, как правило, печатает перетасованные множества одинаково каждый раз:

scala> Set(1,2,3,4,5) 
res29: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

scala> Set(5,4,3,2,1)
res30: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

scala> util.Random.shuffle(res30)
res31: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)