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
?
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
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
Đặ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