01/10/2018, 13:38

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 ạ.

Dark.Hades viết 15:45 ngày 01/10/2018

Ở đâ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)

rogp10 viết 15:49 ngày 01/10/2018

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

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

Nobita viết 15:44 ngày 01/10/2018

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

Nobita viết 15:43 ngày 01/10/2018

em cám ơn anh!!!

Bài liên quan
0