-
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 đỡ.
Cần được giải thích về rand()% và lỗi chia hết cho 0 trong C++
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ớ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)
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.