Bạn cần cung cấp chức năng trình tạo số ngẫu nhiên hoặc đối tượng functor lấy giá trị tích phân và trả về giá trị khác của một số loại không thể tách rời sẽ không tràn các giới hạn của vùng chứa mà trình lặp mà bạn đã chuyển vào hàm lặp qua. Cũng trong trường hợp của một đối tượng functor, nó phải thực hiện các operator()
để nó có thể được gọi là một hàm. Vì bạn cần một trình tạo số ngẫu nhiên an toàn thread, sử dụng srand
và rand
từ cstdlib
là một ý tưởng tồi ... bạn nên tạo một số đối tượng functor thực hiện trình tạo số ngẫu nhiên an toàn chủ đề hoặc trình tạo số ngẫu nhiên không triển khai các biến có thể truy cập trên toàn cầu để mọi thứ vẫn giữ nguyên lưu trữ cục bộ. Ví dụ, một cách có thể hoạt động là bạn có một loại trình tạo số ngẫu nhiên mà bạn đã nhận được từ một thư viện khác. đối với các trình vòng lặp truy cập ngẫu nhiên, thuật toán random_shuffle
sử dụng. Bây giờ tùy thuộc vào những gì thư viện bạn sử dụng, bạn functor có thể trông giống như sau:
class my_rand_gen
{
private:
random_gen_type random_range_gen;
int min;
int max;
public:
my_rand_gen(const random_gen_type& gen, int min_range, int max_range):
random_range_gen(gen), min(min_range), max(max_range) {}
int operator()(int value)
{
//ignore the input value and use our own defined range
//returns a value between min and max
return random_range_gen(min, max);
}
};
Bây giờ bạn có thể gọi các thuật toán như:
random_shuffle(my_vector_start_iter, my_vector_end_iter,
my_rand_gen(rand_generator_lib,
vector_start_index,
vector_end_index));
và nó sẽ shuffle vector ở giữa đầu và các trình vòng lặp kết thúc cho vectơ của bạn mà không làm tràn các giới hạn của vec-tơ ... nói cách khác, nó sẽ chỉ sử dụng các giá trị cho shuffle giữa vector_start_index
và vector_end_index
.
Nói chung, bạn phải làm cho các giả định rằng * gì * trong thư viện C++ là chỉ an toàn trừ khi tài liệu có quy định khác. –
Ngoài ra, 'chủ đề an toàn' là một thuật ngữ quá tải. Một số thuật toán chỉ an toàn nếu chúng hoạt động trên dữ liệu an toàn. Một số là an toàn trên các chủ đề miễn là chỉ có 1 nhà văn, và hầu hết không thể đảm bảo điều đó. Nói chung, khi quyết định cái gì là an toàn (nghĩa là đúng), nó đòi hỏi bạn chỉ định các yêu cầu đọc/ghi khác nhau. – Kylotan
Chỉ cần làm rõ, tôi muốn làm các xáo trộn trên các danh sách khác nhau song song.Vì vậy, tôi không quan tâm đến các cuộc đua trong cấu trúc dữ liệu, chỉ là việc tạo ra các số ngẫu nhiên cho việc trộn. – Mark