Làm cách nào để tôi có thể nhận được một số cụ thể (> 1) các phần tử ngẫu nhiên, riêng biệt từ một bộ sưu tập?Làm thế nào để có được một số lượng cụ thể của các yếu tố ngẫu nhiên từ một bộ sưu tập trong Smalltalk?
Trả lời
Đây là điều mà tôi nghĩ rằng vẻ bề ngoài nhiều hơn hoặc ít tốt đẹp, nhưng không phải là hiệu quả vì nó có thể là:
yourCollection asSet asOrderedCollection shuffled first: numberOfElements
Hãy xem xét đoạn mã sau
sample: anInteger from: aCollection using: aGenerator
| sample |
sample := Set new: anInteger.
[sample size = anInteger]
whileFalse: [ | element |
element := aCollection atRandom: aGenerator.
sample add: element].
^sample asArray
Một số nhận xét
Máy phát điện rõ ràng: Sử dụng một trình tạo được cho một cách rõ ràng, ví dụ: một phiên bản của
Random
, mà tôi đã gọi làaGenerator
. Vì lý do toán học, nếu bạn đang lấy mẫu cho ứng dụng của mình, tất cả chúng nên sử dụng cùng một trình tạo trên chương trình của bạn. Ngoài ra điều này sẽ cung cấp cho bạn một lợi thế bổ sung: lưu và sau đó khôi phục lạiseed
và bạn sẽ có thể tái tạo một hành vi "ngẫu nhiên" trước đó của hệ thống của bạn, đó là tốt cho thử nghiệm.Không séc trị giá tính sẵn sàng: Các mã không kiểm tra xem nó có thể để có được những mẫu mong muốn, đó sẽ là trường hợp nếu
aCollection
không có ít nhấtanInteger
yếu tố khác nhau.Mã không lớp: Phương pháp nên chuyển đến một số lớp học.
Ví dụ:
Random >> sample: anInteger from: aCollection
| sample |
sample := Set new: anInteger.
[sample size = anInteger]
whileFalse: [ | element |
element := aCollection atRandom: self.
sample add: element].
^sample asArray
CẬP NHẬT
Đây là cách tiếp cận khác:
Random >> remove: anInteger from: aCollection
| sample |
sample := OrderedCollection new: anInteger.
anInteger timesRepeat: [| index element |
index := aCollection size atRandom: self.
element := aCollection removeAt: index.
sample add: element].
^sample
Comment
Thường xảy ra khi chúng tôi muốn lấy mẫu mà không lặp lại, chúng tôi cũng muốn xóa các phần tử khỏi bộ sưu tập khi chúng tôi chọn ngẫu nhiên chúng. Trong những trường hợp này, điều thường xảy ra là bộ sưu tập được biết là không có sự lặp lại.
Hmm, tôi thích phương pháp "máy phát điện byo", nhưng nếu bộ sưu tập và kích thước mẫu lớn, bạn có thể bị kẹt về phía cuối chờ đợi một thời gian cho đến khi máy phát điện cuối cùng chọn một số "miễn phí". –
@ AmosM.Carpenter điểm tốt. Những gì tôi sử dụng là gần gũi hơn với cách tiếp cận thứ hai. –
Xin lỗi để được nitpicky, nhưng bạn không nên sử dụng '#removeIndex:' - nó có nghĩa là để được tư nhân. Sử dụng phương thức public '#removeAt:' thay vào đó sẽ có lợi ích bổ sung khi trả lời phần tử đã loại bỏ, có nghĩa là bạn có thể loại bỏ biến tạm thời 'element' bổ sung (tức là chỉ cần' sample add: (aCollection removeAt: index) ') .Cả hai phương thức "remove" đều nằm trong 'OrderedCollection', vì vậy nó sẽ không hoạt động với các loại collection khác. –
- 1. Làm thế nào để có được các yếu tố ngẫu nhiên từ một mảng
- 2. Làm thế nào để lấy n mục ngẫu nhiên từ một bộ sưu tập trong Clojure?
- 3. yếu tố ngẫu nhiên từ mảng chuỗi
- 4. Truy vấn LINQ tối ưu để có được một bộ sưu tập phụ ngẫu nhiên - Trộn ngẫu nhiên
- 5. Làm thế nào để thay đổi một yếu tố cụ thể của một vector STL C++
- 6. Chọn yếu tố ngẫu nhiên trong một unordered_map
- 7. backbone.js: thêm một yếu tố để một bộ sưu tập mà không cần render tất cả các bộ sưu tập
- 8. Trong Clojure, làm thế nào để chống lại hoặc kết hợp các yếu tố của một bộ sưu tập chứ không phải chính bộ sưu tập?
- 9. Bộ sưu tập ngẫu nhiên Java
- 10. Sử dụng AngularJS làm cách nào tôi có thể ngẫu nhiên hóa thứ tự của một bộ sưu tập?
- 11. Làm thế nào để trích xuất một phạm vi từ một bộ sưu tập trong PowerShell?
- 12. Làm thế nào để có được một số ngẫu nhiên trong pascal?
- 13. Có một Hamcrest "cho mỗi" Matcher mà khẳng định tất cả các yếu tố của một bộ sưu tập hoặc Iterable phù hợp với một Matcher cụ thể?
- 14. Làm thế nào để có được một dòng ngẫu nhiên của một tập tin văn bản trong Java?
- 15. Làm thế nào để bạn có được các yếu tố từ một HTMLCollection javascript
- 16. Chọn một yếu tố ngẫu nhiên của một enum trong D
- 17. Làm thế nào để có được một tài liệu nhúng cụ thể bên trong một bộ sưu tập MongoDB?
- 18. Làm thế nào để có được các giá trị ngẫu nhiên từ mảng trong C#
- 19. Chọn 5 yếu tố ngẫu nhiên
- 20. Nhận yếu tố ngẫu nhiên từ mảng trong MongoDB
- 21. Làm thế nào để có được yếu tố cụ thể trong JSON
- 22. Làm thế nào tôi có thể nhận được một số ngẫu nhiên trong Kotlin?
- 23. Làm thế nào có được một UIColor ngẫu nhiên nhưng hạn chế nó để tập hợp các màu sắc
- 24. Backbone.js: Làm thế nào để có được chỉ số của một mô hình trong một bộ sưu tập xương sống?
- 25. Làm thế nào để tạo một phần cấu hình có chứa một bộ sưu tập các bộ sưu tập?
- 26. Làm thế nào để có được một yếu tố tùy ý từ một frozenset?
- 27. PHP: cách làm foreach và bắt đầu từ yếu tố thứ sáu của bộ sưu tập?
- 28. Làm cách nào để tôi có thể xóa một bộ sưu tập là một phần của thực thể jpa?
- 29. Làm thế nào để tạo ra các số ngẫu nhiên có thêm một số lượng nhất định và được tạo ra trong một phạm vi trong JavaScript?
- 30. Làm thế nào để có được một yếu tố có: trong tên của nó?
Rất thanh lịch. Cách duy nhất tôi có thể thấy để cải thiện hiệu quả (thường không phải là vấn đề, nhưng một số người bị treo trên đó ...) sẽ khuấy động _indices_ thay vì thu thập (vì sẽ có ít chỉ mục hơn) , và sau đó sử dụng một cái gì đó như '#atAll:' để chọn các chỉ mục ngẫu nhiên trong một tập hợp (bạn vẫn cần '# asSet' nếu bạn muốn chúng _distinct_). –