Hỏi đáp cách dùng hàm rand() lấy 1 số từ -a đến a mà bỏ đi 0;

trình mình newbie, bạn nói vậy cũng nhũn não lắm

hay thế… mình cũng nghĩ cách random từ 1 đến a rồi nhân với luỹ thừa cái random đó của -1… ngâu thật :smile:

đọc comment đó thì mình hiểu là nó sẽ thực hiện lâu hơn và tốn tài nguyên bộ nhớ hơn.

Cú pháp lệnh if rút gọn đó

<điều kiện> ? <kết quả trả về nếu điều kiện đúng> : <kết quả trả về nếu điều kiện sai>;

phải là => random được âm dương chứ…

(random()%2?1:-1)
phần %2 tức là rand() đc giá trị từ bn đến bn vậy bạn?

À nhầm đầu nghĩ 1 nơi tay đánh 1 nẻo :sweat_smile:

0<=random()%n<n
=> 0<=random()%2<2
=> random được 2 số 0 và 1.
Đồng thời máy cũng tự hiểu 0 (False) 1 (True)
Phần còn lại thì nó làm giống if else.

1 Like

trong C/C++ thì có hàm rand() cho giá trị từ 0 đến RAND_MAX (RAND_MAX là hằng số được định nghĩa là 1 số nào đó tuỳ vào thư viện, thường là 32767)

% là toán tử chia lấy phần dư. a % b sẽ có giá trị thuộc đoạn [0..b-1]

mẫu số thì nên quy định là luôn dương. Tử số có thể âm. Dấu của phân số là dấu của tử số. Làm vậy thì khi random khỏe hơn chỉ cần random [1…b] cho mẫu số, [-a…a] cho tử số là ổn.

nếu buộc phải random khác 0 thì cách này có lẽ tốt hơn: random trong đoạn -a tới a-1, rồi cộng 1 vào giá trị sau cùng nếu giá trị sau cùng >= 0.

vd random -4 tới 4, bỏ số 0:

int n = rand()%8 - 4; //a là số trong dãy [-4,-3,-2,-1,0,1,2,3]
if (n >= 0) n++; //nếu a thuộc [0,1,2,3] thì cộng thêm 1, tức là chuyển thành [1,2,3,4]
return n;

chỉ cần gọi rand() 1 lần :stuck_out_tongue: Bỏ cái if kia đi cũng được: return n + (n >= 0);

3 Likes

Mình xin phép được sửa lại bài của gió một chút:

int getRandom(int n){
    int random = random();
    return (random%n+1)*(random/n%2?1:-1);
}

Cách này tiết kiệm một lần random vì tùy thuộc thuật toán và cách lấy nhân của hàm random() mà đôi khi hai lần random() có thể ra hai kết quả giống nhau dẫn đến việc bị mất số. Ví dụ: n = 4 và cần random ra -3.
(ran%n+1)*(ran%2?1:-1) = -3
=> ran có thể bằng 6 8 10… Tuy nhiên 6 % 2 = 0 nên kết quả lại ra bằng 3.
=> Cách này sẽ bị mất các nhóm số -1 2 -3 4

This post was flagged by the community and is temporarily hidden.

Hàm rand() này trả về 0 hoặc 1. vậy làm sao trường hợp else xảy ra được

Tks 20 kí tự ---------------------------------

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