Xin giải pháp: Nhập tổng lượng vào 1 ô, nó tự chia lượng ra các ô bên dưới·

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Việt Đức Phạm

Thành viên mới
Tham gia
17/5/17
Bài viết
1
Được thích
0
Giới tính
Nam
Chào anh chị em có trường hợp này nhờ anh chị hỗ trợ giúp.
Mình muốn nhập một lượng vào ô Tổng bên trên, bảng tính tự động chia lượng cho mình vào các ô bên dưới. Lượng bên dưới được chia random ( không phải là số liền kề liên tiếp 1 2 3), Mình xin cảm ơn các bạn1705026927860.png
 
Lần chỉnh sửa cuối:
Chào anh chị em có trường hợp này nhờ anh chị hỗ trợ giúp.
Mình muốn nhập một lượng vào ô Tổng bên trên, bảng tính tự động chia lượng cho mình vào các ô bên dưới. Lượng bên dưới được chia random ( không phải là số liền kề liên tiếp 1 2 3), Mình xin cảm ơn các bạnView attachment 298363
Đưa file giả định lên, để nhận được kết quả.
 
Upvote 0
Chào anh chị em có trường hợp này nhờ anh chị hỗ trợ giúp.
Mình muốn nhập một lượng vào ô Tổng bên trên, bảng tính tự động chia lượng cho mình vào các ô bên dưới. Lượng bên dưới được chia random ( không phải là số liền kề liên tiếp 1 2 3), Mình xin cảm ơn các bạnView attachment 298363
Lúc còn đi làm công nhân sợ nhất là phải làm mấy việc như thế này. Đồ giả khó kiểm soát đúng sai.
 
Upvote 0
Lúc đọc báo cáo sợ nhất là mấy cái bảng tính thiết kế kiểu này. Nhìn như cái sọt rác.
Coi chừng bị Excel chưỡi cho bây chừ!


@Tác giả bài đăng: Sao hành văn 1 nẽo mà hình ảnh lại 1 đường là sao vậy, muốn cải lộn cho vui ư?
 
Upvote 0
Bài này chắc là solver, tuy nhiên vì chưa thuần chủng được nó nên tớ không chắc lắm là có thành công không. Nên mò thử.
Trừ phi người thực hiện rất khó tính, chứ bài toán này là dạng bá cá mau. Ở đây thi thoảng vẫn gặp.

- Nếu STT là 1 thì Randbetween(1, tổng - (số các khách còn lại : tức là 10 - STT))
- Nếu STT < 10 thì Randbetween(1, tổng - (số các khách còn lại) - (tổng từ STT1 đến STT(n-1)))
- Nếu STT = 10 thì tổng - (tổng từ STT1 đến STT9)

Tạo sao phải tính số còn lại?
Để bảo đảm không bị hết hàng, các khách còn lại sẽ bị 0

Tại sao "khó tính"?
Giải thuật này không hoàn toàn là "random". Các số đầu sẽ có khuynh hướng lớn hơn các số sau.
 
Lần chỉnh sửa cuối:
Upvote 0
Góp vui. 1 giải pháp bằng VBA.
Mã:
Option Explicit

Function SoTuDong(ByVal Tien As Long, Dong As Integer) As Variant
Dim i, T&, Tong&, ConLai&, TongCong&, D&, C&
Dim Rng As Range
D = Int(Tien / Dong / 2): C = D * 3
ReDim KQ(1 To Dong, 1 To 1)
Do
    TongCong = 0: Tong = 0
    For i = 1 To Dong
        If i <> Dong Then
          T = Application.WorksheetFunction.RandBetween(D, C)
            KQ(i, 1) = T
            Tong = Tong + T
            ConLai = Tong - Tien
        Else
            If ConLai < 0 Then KQ(Dong, 1) = ConLai * -1
            TongCong = Tong + KQ(Dong, 1)
        End If
    Next i
Loop While TongCong <> Tien
SoTuDong = KQ
End Function
Cú pháp : SoTuDong=(Tổng số;số dòng) Enter để có kết quả. cứ mỗi lần Enter là có 1 kết quả khác nhau nhưng tổng số vẵn bằng Số cho trước.
Ví dụ: Số lít = 100 ; số dòng =10 : D4=SoTuDong(100;10)
 
Upvote 0
Về phân chia cái "Tổng số lít" này cũng khó nói lắm
Vào mùa, nhà nhà đều nhậu thì có lẽ cái số lít chênh lệch giữa các nhà cũng không nhiều lắm. Nhưng mà lúc trái vụ, chênh lệch về số lít giữa các nhà lại là rất đáng kể.

Việc này có lẽ chủ thớt cũng cần bổ sung thêm 1 hoặc là vài yếu tố thời vụ nữa mới có thể phân bổ giống thực tế được
 
Upvote 0
Góp vui. 1 giải pháp bằng VBA.

Option Explicit

Function SoTuDong(ByVal Tien As Long, Dong As Integer) As Variant

End Function

Cú pháp : SoTuDong=(Tổng số;số dòng) Enter để có kết quả. cứ mỗi lần Enter là có 1 kết quả khác nhau nhưng tổng số vẵn bằng Số cho trước.
Ví dụ: Số lít = 100 ; số dòng =10 : D4=SoTuDong(100;10)
Nhưng số lít chỉ gấp 3 lần số dòng trở lại thì trùng khá nhiều!Mà đề bài là không liên tục thôi; Trùng chắc được chấp nhận!
 
Upvote 0
thì nó mới khó bác ạ.
Bài này em thử Solver thì cũng được, nhưng khoảng 5, 7 lần nó lại lọt ra số lít lẻ thập phân, có lúc lại 10, 11 lần; rồi có lúc tổng nó lại vọt lên 3, 400.
Thành ra em cũng không rõ Solver của MS có chuẩn không nữa.
Em đang thử thì kết quả nhận được chưa xét đến điều kiện các số liên tiếp không được hơn kém nhau <=1 đơn vị.
 
Upvote 0
Góp vui chủ thớt giải pháp
Tạo cột phụ j2 đến j10 = randbetween(1,99)
L2 =SUMPRODUCT(IFERROR(SMALL($J$2:$J$10,ROW(A1)-{0,1}),{100,0}),{1,-1})
Nhược điểm: vì lấy hiệu số nên kết quả nhận được thường số không lớn lắm. Và lâu lâu trong dãy J2:j10 có số trùng nhau thì sẽ có kết quả 0.
1705132480680.png
 
Upvote 0
Nhưng số lít chỉ gấp 3 lần số dòng trở lại thì trùng khá nhiều!Mà đề bài là không liên tục thôi; Trùng chắc được chấp nhận!
Cảm ơn anh đã ghé xem bài và tương tác.
Tôi nhĩ là lấy số Top chỉ =1,5 lần và Bottom chỉ bằng nửa số trung bình thì để cho code chạy ít vòng lặp, chứ để nhiều tức là nâng số bottom lên ( ví dụ: số top =Số lít/số dòng x n lần nào đó ) thì vòng lặp Do....... Loop phải chạy có thể rất nhiều lần và dễ sa vào vòng lặp thiếu kiên nhẫn.
Với lại chủ thớt cũng không có điều kiện là không được trùng lặp nên phương án lấy Bottom = 0,5 và top = 1,5 sô trung bình có thể được chấp nhận.
 
Upvote 0
Cũng được, nhưng phải tạo cột phụ 99 ô, tương ứng với tổng 100 lit.

=SUMPRODUCT(IFERROR(SMALL(RANK($B$2:$B$10;$B$2:$B$100);ROW(A1)-{0;1});{100;0});{1;-1})

Vẫn có khả năng có số bằng 0, nhưng tỷ lệ rất thấp.
 

File đính kèm

  • Screenshot_20240113_165754_com.microsoft.office.excel.jpg
    Screenshot_20240113_165754_com.microsoft.office.excel.jpg
    82.3 KB · Đọc: 3
Lần chỉnh sửa cuối:
Upvote 0
Cho phép ham vui xíu nha:
PHP:
Function SoTuDong(ByVal Tien As Long, Dong As Integer) As Variant
Dim fNum As Integer, TB As Long, J As Integer, Tong As Integer

TB = Tien / Dong:                           Randomize
ReDim KQ(1 To Dong, 1 To 1)
Do
    J = J + 1:
    If J = Dong Then
        KQ(Dong, 1) = Tien - Tong:          Exit Do
    End If
    fNum = J + TB * Rnd()
    KQ(J, 1) = fNum \ 1
    Tong = Tong + KQ(J, 1)
Loop
SoTuDong = KQ()
End Function
Nhưng số lít cần nhập nên gấp 6 lần trở lên so với số dòng mới đẹp mảng nhận được
 
Upvote 0
Cám ơn bác đã chỉ. Em sửa lại như sau:
=SUMPRODUCT(IFERROR(SMALL($B$2:$B$10;ROW(A1)-{0;1});{90;0});{1;-1})+1
Với b2:b10 = RANDBETWEEN(0;90)
Ở bài #7 tôi đã đề cập vụ này rồi. Cách phân bổ duy nhất để tránh 0 là trừ trước.
Mỗi ô sẽ nhận 1 trước khi bắt đầu phân bổ.
Excel 365 có hàm tạo số ngẫu nhiên cho mảng, có mảng động, nên có thể áp dụng cho số tổng và số dòng là bất kỳ.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom