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 .
Hỏi về code với xác suất?
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.
để 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 đó.
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)
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
Mò nãy giờ mới ra công thức.
Đang thử không dùng if else.
à à 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
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
vậy nếu là 49 và 51 % thì sao ?
a = 49.
Nếu là 49% thì
- 49/(100 - 49) = 49/51
- c = 49, d = 51
- d - 1 < c + e <=> 51 - 1 < 49 + e <=> e > 1
- Chọn e = 2
- f = c + e = 49 + 2 = 51
Thực hiện tương tự:
- random() : nửa đoạn [0; 1)
- (c+d) * random() = (49 + 51) * random() = 100 * random() : nửa đoạn [0; 100)
- [100 * random()] (lấy nguyên) : tập số nguyên { 0; 1; 2;…; 48; 49; 50;… 99 }
- Cộng e = 2 : tập { 2; 3; 4; …; 50; 51; 52;…; 101 }
- 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)
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
đâ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