2012-06-28 25 views
11
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) 

Vì vậy, xáo trộn có thể xử lý Lists tốt, nhưng không phải bộ? Không thể đặt bộ đệm? Tại sao res10 == res11 == res12?Hành vi của ngẫu nhiên trên Set vs Danh sách sử dụng scala.util.Random

+0

Đơn khiếu nại của bạn không phải về hành vi của ngẫu nhiên mà là hành vi của Set. Hợp đồng Set không ngụ ý bảo quản trật tự - thuận tiện cho phép tối ưu hóa như sao lưu Set bằng hashtable - do đó gọi toSet là lời mời sắp xếp lại bộ sưu tập của bạn. –

Trả lời

20

Bộ của Scala không được đặt hàng (giống như các bộ của toán học). Họ là iterable, tuy nhiên-bạn chỉ không thể dựa vào thứ tự mà bạn sẽ nhận được các mục trong. Nhiều triển khai của bộ sẽ lặp các yếu tố trong cùng một lệnh tức là,

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

nào giải thích hiệu ứng bạn đang thấy ở đây. Bạn không bao giờ nên dựa vào điều này, mặc dù - có thể có một thực thi Set hợp lệ hoàn hảo mà trên đó sẽ không giữ.

+1

Uh ... ok. Tôi chấp nhận lời giải thích của bạn, mặc dù tôi không nghĩ Random.shuffle đang hoàn thành postcondition ở đây. Thuật toán trộn phải cung cấp thứ tự ngẫu nhiên bất kể vùng chứa bên dưới. Rất dễ dàng để cung cấp hành vi này. Ví dụ: Random.shuffle ((1 đến 10) .toSet) có thể gọi nội bộ Random.shuffle ((1 đến 10) .toSet.toList) để có được một thứ tự tùy ý, sau đó có thể được xáo trộn. –

+7

Đó là một chút lạ, và tôi không chắc chắn tại sao 'shuffle' được định nghĩa cho bất kỳ' TraversableOnce' (thay vì nói 'Seq'). Nó chỉ đơn giản là không thể viết một phiên bản của 'shuffle' cho các bộ sẽ cung cấp một thứ tự ngẫu nhiên, vì nó không có ý nghĩa để nói về _any_ loại thứ tự cho các bộ. –

+2

Chỉ nhìn thấy chỉnh sửa bình luận của bạn: có, nhưng 'shuffle' trả về một bộ sưu tập cùng kiểu với đầu vào của nó và ngay sau khi bạn đặt danh sách xáo trộn trở lại vào một tập hợp bạn đang mắc kẹt trong cùng một tình huống. –

1

Ngẫu nhiên là "xáo trộn" Set; nó chỉ không có hiệu ứng nhìn thấy được vì các bộ không có thứ tự. REPL xảy ra để in các bộ xáo trộn theo cùng một cách mỗi lần:

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

Vâng, đó là khá nhiều điều tương tự như câu trả lời hiện có từ ba năm trước đây –

+0

Tôi không đồng ý. Câu trả lời của tôi không giống nhau và rõ ràng hơn và dễ hiểu hơn đối với người mới bắt đầu. Tôi muốn nghe ý kiến ​​của @kr về câu trả lời nào rõ ràng hơn. Nhận xét của ông chỉ ra rằng câu trả lời khác là không. – retrospectacus

+0

Vì @kr là "Được thấy lần cuối vào ngày 21 tháng 8 năm 1313 lúc 22:13", bạn không có khả năng nhận được điều đó. Và kể từ khi anh ấy chấp nhận nó, tôi cho rằng anh ấy đã tìm thấy nó rõ ràng sau những lời bình luận. –

Các vấn đề liên quan