Hỏi về code với xác suất?

Mình có bài như thê này : Có 1 tài khoản trong 1 ngân hàng ,
Rút tiền trong tài khoản ngân hàng , trừ phí giao dich sau mỗi lần rút thành công , với xác suất 30 % không mất phí và 70 % mất phí bằng đúng số tiền rút .Viết thuật toán rút tiền với xác suất cho trên.Hết
Mình thắc mắc không biết dùng thuật toán kiểu gì để làm bài này .
Bạn nào giúp mình với .

Ai giúp mình với iiiiiiiiiiiiiiiii

Gọi là thuật toán thì phải có input và output. Với đề bài nửa vời như thế này thì không thể nào giải được. Bạn xem kỹ lại đề xem có chính xác chưa.

1 Like

để mình xem lại , thì nó cũng chỉ có thế thôi

Mình sửa rồi đấy bạn xem dùm với

Đó là “thuật toán” ngẫu nhiên thôi.
30 + 70 = 100, ngẫu nhiên từ 1 - 100, rơi vào khoảng nào(30 hoặc 70) thì lấy khoảng đó.

4 Likes

rõ hơn được không bạn ơi , mình chưa hiểu lắm

Số dư trong tài khoản là b, số tiền cần rút là m

b -= m * (1 + ((int)(10 * Math.random()) + 4) / 7);

Giải thích

random(): số thực trong [0; 1)
10 * random() : số thực trong [0; 10)
(int)(10 * random()) : số nguyên trong tập { 0; 1; 2; 3; 4; 5; 6; 7; 8; 9 }
(int)(10 * random()) + 4 : số nguyên trong tập { 4; 5; 6; 7; 8; 9; 10; 11; 12; 13 }
((int)(10 * random()) + 4) / 7 : số nguyên trong tập { 0; 0; 0; 1; 1; 1; 1; 1; 1; 1 } (3 số 0, 7 số 1)

4 Likes

cám ơn ạn nhều lắm lắm .
Nếu được giải thích kỹ hơn nữa thì mai mình không ăn sáng nữa.
chân thành cảm ơn.

Mình ghi rồi, bấm vào mục “Giải thích” ấy :grin:
Mò nãy giờ mới ra công thức.
Đang thử không dùng if else.

3 Likes

à à hiểu rồi , cám ơn bạn nhiều lắm

giả sử là 49% và 51% thì làm sao hả bạn ?

công thức này tự bạn nghĩ hay ở đâu thế hả bạn

ghi rồi, mình “mò”. Thế thử vài số ăn may được thôi :joy:

Các bước mò đại khái thế này, giả sử cần a%:

  • Tính phân số a/(100-a), tối giản, được c/d.
  • Lấy random() * (c+d) ra khoảng số thực thuộc nửa đoạn [0; c+d), lấy 0 nhưng không lấy c+d.
  • Lấy phần nguyên được tập hợp { 0; 1; 2;…; c+d-1}
  • Sau đó thêm số e nào đó, cộng cho e rồi chia cả đống cho f = c + e, khi đó từ (c + e)/f tới (c+d-1+e)/f bằng 1, còn từ (0+e)/f đến (c-1+e)/f bằng 0.

e là số tự mò sao cho c + d - 1 + e < 2f = 2(c + e) => d - 1 < c + e

4 Likes

vậy nếu là 49 và 51 % thì sao ?

a = 49.

2 Likes

Nếu là 49% thì

  1. 49/(100 - 49) = 49/51
  2. c = 49, d = 51
  3. d - 1 < c + e <=> 51 - 1 < 49 + e <=> e > 1
  4. Chọn e = 2
  5. f = c + e = 49 + 2 = 51

Thực hiện tương tự:

  1. random() : nửa đoạn [0; 1)
  2. (c+d) * random() = (49 + 51) * random() = 100 * random() : nửa đoạn [0; 100)
  3. [100 * random()] (lấy nguyên) : tập số nguyên { 0; 1; 2;…; 48; 49; 50;… 99 }
  4. Cộng e = 2 : tập { 2; 3; 4; …; 50; 51; 52;…; 101 }
  5. Chia f = 51, lấy phần nguyên: tập { 0; 0; 0;… ; 0; 1; 1; …; 1 } (50-2+1=49 số 0, 101-51+1=51 số 1)
5 Likes

thank u so much , rất cảm ơn các bạn

bạn giỏi quá , cho mình xin face hay cái gì đấy tương tự để có gì mình hỏi với

Đây bạn.

https://daynhauhoc.com/

1 Like

đâu face đâu , có thấy gì đâu

Đây là cách của mình, thông cảm vì mình ko viết code java

def withdraw(m1, m2, c=30):
    return m1 - m2 * (1 and random.randint(0, 99) < c or 2)

m1 là số tiền hiện có, m2 là số tiền cần rút

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