2011-08-03 56 views
12

Có một số chức năng, tương tự như srand(), mà tôi cần phải gọi để đảm bảo rằng std::random_shuffle() luôn tạo ra các kết quả khác nhau? tức là nếu tôi gọi nó nhiều lần với cùng một dữ liệu, tôi muốn thứ tự khác nhau mỗi lần. Làm thế nào tôi có thể chắc chắn về điều đó?Làm thế nào để đảm bảo rằng std :: random_shuffle luôn tạo ra một kết quả khác?

+3

Đó doesn' t âm thanh rất ngẫu nhiên với tôi ... – Blindy

+1

@Blindy: Đó là ngẫu nhiên, nhưng kết quả không được phân phối đồng đều. –

+0

srand khá tốt. Nếu nó không đủ tốt cho nhu cầu của bạn, hãy tìm kiếm các máy phát ngẫu nhiên khác (có thể tăng) –

Trả lời

13

std::random_shuffle có hai hình thức. Một trong đó có 2 đối số (bắt đầu/kết thúc vòng lặp), và một trong đó có 3 (bắt đầu/kết thúc vòng lặp và một máy phát điện ngẫu nhiên).

Biểu mẫu đầu tiên sử dụng std::rand(), vì vậy bạn sẽ sử dụng std::srand() để tạo hạt giống cho trình tạo số ngẫu nhiên. Bạn cũng có thể sử dụng phiên bản 3 đối số và tự cung cấp RNG.

+7

Khi tôi hiểu nó, cách thức đầu tiên thực hiện nó là kinh doanh của nó. Một số nền tảng có thể không sử dụng 'std :: rand'. –

+0

Bạn nói đúng. Tôi đã nhìn vào phiên bản libstdC++. Tác giả gốc nên tham khảo tài liệu cho STL của bạn. Hoặc nếu họ không muốn dựa vào đó, họ nên sử dụng dạng thứ 3 và sử dụng một cái gì đó như 'boost :: random' hoặc C++ 0x' std :: random'. –

6

std::random_shuffle có quá tải mẫu để chỉ định RNG.

template <class RandomAccessIterator, class RandomNumberGenerator> 
    void random_shuffle (RandomAccessIterator first, RandomAccessIterator last, 
         RandomNumberGenerator& rand); 

reference

3

Tôi nghĩ rằng bạn có thể cho một functor phát ngẫu nhiên để std :: random_shuffle, vì vậy bạn có thể có thể kiểm soát hoàn toàn thế hệ số ngẫu nhiên. Tìm kiếm here, hàm functor này thay thế cho đối số mẫu RandomNumberGenerator.

3

Thường gọi srand(time(NULL))trước gọi std :: random_shuffle() sẽ cung cấp cho bạn những gì bạn cần, nó cung cấp cho bạn kết quả khác nhau mỗi khi bạn gọi std :: random_shuffle(). Đó là bởi vì std :: random_shuffle() gọi nội bộ rand() trong quá trình triển khai thực hiện nhiều nhóm (ví dụ: VS2008 và gcc).

Tất nhiên bạn có thể tự mình làm RNG nếu bạn muốn gọi std quá tải khác :: random_shuffle với tham số bổ sung.

2

Như một phương sách cuối cùng, bạn có thể:

  • Gọi std::random_shuffle
  • Tính một hash của chuỗi, lưu trữ nó trong một std::set
  • Huỷ nếu băm đã có mặt

Tôi không thấy cách sử dụng trình tạo tùy chỉnh có thể bảo đảm đảm bảo rằng chuỗi là duy nhất.

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