Cấn giúp đỡ viết lại hàm shuffle trong C++ bằng ngôn ngữ C

Em đang code C, mà đến chỗ cần một hàm cõ chức năng như hàm shuffle mà em nghĩ mãi không ra, anh chỉ biết có thể hướng dẫn cho em được không ạ.
Đây là source code C++

template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
                       RandomNumberGenerator& gen)
{
  iterator_traits<RandomAccessIterator>::difference_type i, n;
  n = (last-first);
  for (i=n-1; i>0; --i) {
    swap (first[i],first[gen(i+1)]);
  }
}

nhưng em khong hiểu và không chuyển về C được.
Em cám ơn ạ.

Ở đây họ dùng template để không phải overload.
Hàm shuffer này cũng chỉ có tác dụng với số thực/nguyên/char mà thôi.
Để đơn giản hoá thì bạn có thể viết lại cho từng kiểu dữ liệu khác nhau qua overload function.

Thuật toán của họ là cài đặt hàm nhận vào 3 con trỏ trên C

@param {int*} Địa chỉ của kí tự bắt đầu thực hiện shuffer
@param {int*} Địa chỉ cuối cùng của mảng đó
@param {function*} Một địa chỉ hàm sinh số ngẫu nhiên

Việc còn lại thì bạn chỉ cần đọc bên trong là hiểu họ làm thế nào rồi.
(Bạn nên xem cả hàm cài đặt sinh số ngẫu nhiên của họ để tránh swap phải giá trị ngoài vùng nhớ của mảng)

1 Like

Cái này gọi là Knuth shuffle :slight_smile:

1 Like

em cám ơn anh ạ.!!!

em cám ơn anh!!!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?