2016-06-28 28 views
7

Tôi có hai vectơ có cùng số phần tử nhưng các loại của chúng có kích thước hoàn toàn khác nhau. Tôi cần xáo trộn chúng để cả hai đều có cùng thứ tự chính xác sau khi xáo trộn (mỗi phần tử trong một vector liên quan đến từng phần tử trong phần tử kia). Cách tôi tìm thấy để làm điều đó là:Liệu `std :: shuffle` có đảm bảo cùng thứ tự với cùng một hạt giống trên các vectơ khác nhau không?

// sizeof(a[0]) != sizeof(b[0]) 
// a.size() == b.size() 
{ 
    std::mt19937 g(same_seed); 
    std::shuffle(a.begin(), a.end(), g); 
} 
{ 
    std::mt19937 g(same_seed); 
    std::shuffle(b.begin(), b.end(), g); 
} 

Tôi có thể yên tâm rằng cả hai vectơ sẽ được xáo trộn theo cùng một cách? Việc triển khai này có phụ thuộc không? Tôi có bảo đảm như vậy từ đặc điểm kỹ thuật std::shuffle?

+4

Có lẽ bạn nên nén chúng vào một vectơ các cặp trước khi thực hiện trộn, hoặc thay vào đó tạo một vectơ mới của các chỉ mục, xáo trộn và sử dụng nó để lập chỉ mục vào các vectơ song song. – Taywee

+0

Nỗ lực đầu tiên của tôi là véc tơ của các chỉ mục, nhưng dữ liệu của tôi lớn và không vừa với hai bản sao trong bộ nhớ của tôi, do đó tôi đã thử tải nó từ đĩa theo thứ tự xáo trộn, tất nhiên là chậm quá. Vì vậy, tôi đã làm điều này theo cách khác để có thể đọc từ đĩa tuần tự (rất nhanh) và shuffle tại chỗ (không có bộ nhớ đôi). – lvella

+0

Đặc điểm kỹ thuật không hoàn toàn đảm bảo điều này mặc dù rất khó để tưởng tượng một thực hiện mà sẽ không đưa ra những hạn chế tiêu chuẩn đặt trên shuffle. Bản thân thuật toán 'suffle' có vẻ khá đơn giản để viết nên tôi sẽ viết bản thực hiện của chính tôi để đảm bảo cho tôi. https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle – Galik

Trả lời

8

Có một tuyên bố thú vị về ngẫu nhiên trong đặc tả:

Ghi chú: Trong phạm vi mà việc thực hiện chức năng này sử dụng số ngẫu nhiên, đối tượng g sẽ đóng vai trò là nguồn của việc thực hiện ngẫu nhiên.

Mặc dù vậy, tuyên bố đó không giúp bạn. Phần "Nhận xét" là văn bản quy phạm, vì vậy, điều này nói rằng g sẽ cung cấp số ngẫu nhiên để xác định thứ tự xáo trộn. Tuy nhiên, nó không tuyên bố rằng g là yếu tố duy nhất xác định hoán vị.

Mặc dù kích thước của giá trị của vùng chứa có thể không quan trọng, không có bảo đảm rằng một số thuộc tính thuộc loại này sẽ không ảnh hưởng gì đó. Ví dụ: nếu loại giá trị được sao chép một cách trivially, việc triển khai có thể sử dụng một phiên bản khác của hàm sử dụng một thuật toán hơi khác. Tuy nhiên, nếu nó là một giá trị có kích thước đăng ký, nó có thể không.

Tóm lại, không, std::shuffle không đảm bảo những gì bạn đang tìm kiếm.

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