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 đỡ.
Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.
À, ý 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ư.
Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.
Mình vẫn chưa hiểu ý bạn lắm ?
Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.
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ớiRAND_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()
chor - 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 trar > 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)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 %.
Bạn có 1 định lý trong toán học là số dư thì tuôn bé hơn số chia.