01/10/2018, 00:40

Cần được giải thích về rand()% và lỗi chia hết cho 0 trong C++

  • Hi anh/chị/bạn,

  • Mình đang làm 1 bài tập về Quicksort, sử dụng Visual Studio 2015, khi mình gọi chốt ngẫu nhiên trong 1 mảng như sau :

    int a, b, pivot;
    pivot = arr [ a + rand()%( a - b +1 )];

  • Nếu chạy thẳng chương trình , nó sẽ báo lỗi sau :

  • Nếu debug, thì chạy đoạn đầu sẽ ok, nó sẽ cho cái pivot giá trị của arr [ a + rand()%( a - b +1 )], tuy nhiên, sẽ có 1 lúc nào đó, nó sẽ bị vướng vào lỗi division by 0.

  • Câu hỏi của mình là :
    1. Sao lúc đầu thằng rand() sử dụng dấu % như là dấu mốc ( tức là lấy giá trị từ 0 -> số sau dấu % để sinh số ngẫu nhiên) nhưng sau đó lại sử dụng dấu % như là một phép tính ?

  • Cảm ơn anh/chị/bạn đã giúp đỡ.

Tao Không Ngu. viết 02:41 ngày 01/10/2018

Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.

NamNH viết 02:44 ngày 01/10/2018

À, ý mình đang thắc mắc là cái % đó không phải là phép chia lấy dư, mà nó đi theo cái rand() để nó lấy random từ 0 -> cái số phía sau dấu % đó bạn.

Mà tại sao lúc thì Visual Studio tính dấu đó là dấu của rand(), lúc thì tính là dấu chia lấy dư.

Tao Không Ngu. viết 02:47 ngày 01/10/2018

Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.

NamNH viết 02:55 ngày 01/10/2018

Mình vẫn chưa hiểu ý bạn lắm ?

Tao Không Ngu. viết 02:44 ngày 01/10/2018

Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.

viết 02:51 ngày 01/10/2018

x % y luôn luôn là phép chia lấy dư, làm gì có vụ “tính dấu đó là dấu của rand()”?

rand() là lấy 1 số ngẫu nhiên từ 0 tới RAND_MAX. Nhưng mảng của bạn chỉ có kích cỡ r - l + 1, nên index chỉ được nằm trong đoạn [0...r-l]. Vì vậy phải chia lấy dư rand() cho r - l + 1.

ví dụ bạn random ra số 12345, nhưng kích cỡ mảng chỉ có 9 phần tử, bạn phải lấy random index từ 0-8, nên bạn lấy xài phép chia lấy dư 12345 % 9 = 6 để lấy index nằm trong đoạn [0,8].

còn về vụ bị chia cho 0 thì bạn phải kiểm tra xem r - l + 1 có bằng 0 hay ko. Hay nói cách khác trước đó bạn phải kiểm tra r > l thì mới tiếp tục (nếu r = l thì mảng có 1 phần tử, khỏi sort tiếp)

NamNH viết 02:47 ngày 01/10/2018

Cảm ơn bạn, rất chi tiết và dễ hiểu, qua đoạn bạn giải thích thì mình đã hiểu vấn đề này rồi

Trước giờ cứ tưởng % là cái mốc để cho random trong khoảng từ 0 đến số sau dấu %.

Tao Không Ngu. viết 02:49 ngày 01/10/2018

Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.

Bài liên quan
0