Tạo số ngẫu nhiên theo điều kiện, tổng các số ngẫu nhiên bằng số đã cho trước đó. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

v.quang92

Thành viên mới
Tham gia
16/3/13
Bài viết
6
Được thích
1
Chào anh chị,

Nhờ anh chị giúp em về việc tạo một dãy số ngẫu nhiên (được trùng nhau) sao cho tổng các số này (số nguyên) bằng 1 số đã cho trước đó, dãy số này khoảng 150 hàng. Không nhất thiết tất cả các ô đều chứa số, có ô chứa số 0 cũng được.
VD: Cho B1 = số 1234, cột B5:B155 sẽ chứa các số ngẫu nhiên miễn sao tổng lại bằng B1.
Cho C1 = số 100, cột C5:C155 sẽ chứa các số ngẫu nhiên để tổng lại = C1.
Em có xem trên diễn đàn hướng dẫn cách sử dụng add-in Solver nhưng chưa hiệu quả lắm vì số liệu nhiều nên chạy hơi chậm, và kết quả cũng không để ngẫu nhiên, như trường hợp có 100 số nhưng chia cho 150 hàng thì Solver tính 50 người đầu sẽ là 0.0.0... 100 người sau là 1.1.1.1... (nếu mỗi ô 1.1.1... thì em cần thể hiện trải đều trong cột đó, không phải tập trung hết trên các dòng đầu hoặc các dòng cuối).
Cảm ơn anh chị.
 

File đính kèm

1. Số nguyên hay số thập phân?
2. Ô chứa số 0 là do xổ ra số 0 hay do nó được chọn ngẫu nhiên là 0?

Giải toán:
Đem 1234 chia cho 150 -> số trung bình (STB)
Lấy Random từ 0 đến 2*STB
Cộng lại -> tổng (TONG)
Tính sai số 1234 - TONG -> sai số (SS)
Cộng mỗi số Random trên cho SS/150
 
Upvote 0
Chào anh chị,

Nhờ anh chị giúp em về việc tạo một dãy số ngẫu nhiên (được trùng nhau) sao cho tổng các số này (số nguyên) bằng 1 số đã cho trước đó, dãy số này khoảng 150 hàng. Không nhất thiết tất cả các ô đều chứa số, có ô chứa số 0 cũng được.
VD: Cho B1 = số 1234, cột B5:B155 sẽ chứa các số ngẫu nhiên miễn sao tổng lại bằng B1.
Cho C1 = số 100, cột C5:C155 sẽ chứa các số ngẫu nhiên để tổng lại = C1.
Em có xem trên diễn đàn hướng dẫn cách sử dụng add-in Solver nhưng chưa hiệu quả lắm vì số liệu nhiều nên chạy hơi chậm, và kết quả cũng không để ngẫu nhiên, như trường hợp có 100 số nhưng chia cho 150 hàng thì Solver tính 50 người đầu sẽ là 0.0.0... 100 người sau là 1.1.1.1... (nếu mỗi ô 1.1.1... thì em cần thể hiện trải đều trong cột đó, không phải tập trung hết trên các dòng đầu hoặc các dòng cuối).
Cảm ơn anh chị.
Cái này ngẫu nhiên quá, vì chẳng thấy có giới hạn nào cả. Vậy thì cứ dùng đại hàm Rand(), nhân lên bao nhiêu lần tùy bạn, rồi làm tròn số. Số cuối cùng lấy tổng định trước trừ đi 149 hàng đã tính. Căn số lần nhân lên sau hàm Rand() phù hợp để số cuối cùng không bị âm là được.
 
Upvote 0
Cái này ngẫu nhiên quá, vì chẳng thấy có giới hạn nào cả. Vậy thì cứ dùng đại hàm Rand(), nhân lên bao nhiêu lần tùy bạn, rồi làm tròn số. Số cuối cùng lấy tổng định trước trừ đi 149 hàng đã tính. Căn số lần nhân lên sau hàm Rand() phù hợp để số cuối cùng không bị âm là được.

Ở đây có tới 150 số lận. Cần phải có một giải thuật "rải đều". Nếu không bạn sẽ bị tình trạng đầu voi đuôi chuột, hoặc ngược lại.
 
Upvote 0
Upvote 0
Xin lỗi quên, còn thiếu chút xíu.
Khi cộng phân bổ số dư, nếu kết quả là âm thì đổi nó ra 0 rồi đem phần đó nhâp sang số 2 bên nó.
Hoặc nếu muốn chính xác hơn thì dùng chính sách rải lại.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh chị,

Nhờ anh chị giúp em về việc tạo một dãy số ngẫu nhiên (được trùng nhau) sao cho tổng các số này (số nguyên) bằng 1 số đã cho trước đó, dãy số này khoảng 150 hàng. Không nhất thiết tất cả các ô đều chứa số, có ô chứa số 0 cũng được.
VD: Cho B1 = số 1234, cột B5:B155 sẽ chứa các số ngẫu nhiên miễn sao tổng lại bằng B1.
Cho C1 = số 100, cột C5:C155 sẽ chứa các số ngẫu nhiên để tổng lại = C1.
Em có xem trên diễn đàn hướng dẫn cách sử dụng add-in Solver nhưng chưa hiệu quả lắm vì số liệu nhiều nên chạy hơi chậm, và kết quả cũng không để ngẫu nhiên, như trường hợp có 100 số nhưng chia cho 150 hàng thì Solver tính 50 người đầu sẽ là 0.0.0... 100 người sau là 1.1.1.1... (nếu mỗi ô 1.1.1... thì em cần thể hiện trải đều trong cột đó, không phải tập trung hết trên các dòng đầu hoặc các dòng cuối).
Cảm ơn anh chị.
Có 2 cách để bạn chọn:
-Ngẫu nhiên
-Rải dều
 

File đính kèm

Upvote 0
PHP:
Option Explicit
Sub TaoSoNgauCoTongChoTruoc()
 Const Tg% = 1234
 Dim TB%, J%, Tong&, Hieu%
 
 TB = Tg \ 150
 For J = 2 To 151
    Cells(J, "d").Value = (1 + (TB - 1) * 2 * Rnd()) \ 1
 Next J
 Tong = Application.WorksheetFunction.Sum([D2].Resize(150))
 [A8].Value = Tong
 Hieu = Tong - Tg
 If Tong > Tg Then
    For J = 2 To 151
        With Cells(J, "d")
            If .Value > TB Then
                .Value = .Value - 1
                Hieu = Hieu - 1
            End If
        End With
        If Hieu = 0 Then Exit For
    Next J
 Else
    For J = 2 To 151
        With Cells(J, "d")
            If .Value < TB Then
                .Value = .Value + 1
                Hieu = Hieu + 1
            End If
        End With
        If Hieu = 0 Then Exit For
    Next J
 End If
End Sub
 
Upvote 0
Có 2 cách để bạn chọn:
-Ngẫu nhiên
-Rải dều
Các công thức của bạn không có cái nào thật sự là ngẫu nhiên cả. Tôi giả sử số cần chia là 1, nếu là ngẫu nhiên thì tất cả các ô đều có cơ hội có giá trị 1 này nhưng công thức của bạn thì toàn nằm ở cuối.
Chào anh chị,

Nhờ anh chị giúp em về việc tạo một dãy số ngẫu nhiên (được trùng nhau) sao cho tổng các số này (số nguyên) bằng 1 số đã cho trước đó, dãy số này khoảng 150 hàng. Không nhất thiết tất cả các ô đều chứa số, có ô chứa số 0 cũng được.
VD: Cho B1 = số 1234, cột B5:B155 sẽ chứa các số ngẫu nhiên miễn sao tổng lại bằng B1.
Cho C1 = số 100, cột C5:C155 sẽ chứa các số ngẫu nhiên để tổng lại = C1.
Em có xem trên diễn đàn hướng dẫn cách sử dụng add-in Solver nhưng chưa hiệu quả lắm vì số liệu nhiều nên chạy hơi chậm, và kết quả cũng không để ngẫu nhiên, như trường hợp có 100 số nhưng chia cho 150 hàng thì Solver tính 50 người đầu sẽ là 0.0.0... 100 người sau là 1.1.1.1... (nếu mỗi ô 1.1.1... thì em cần thể hiện trải đều trong cột đó, không phải tập trung hết trên các dòng đầu hoặc các dòng cuối).
Cảm ơn anh chị.
Tôi dùng công thức (xem file). Macro thì làm theo cách tính tương tự như công thức:
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dùng phương pháp "chia phần theo tỷ lệ ngẫu nhiên" như #10 trên cũng là một thuật toán để phân bổ rất tốt. Việc tính trị kiểu gián tiếp có thực là ngẫu nhiên hay không thì tùy vào quan điểm.
 
Upvote 0
Có 2 cách để bạn chọn:
-Ngẫu nhiên
-Rải dều
Bạn ơi , giúp mình với mình muốn tạo 1 dải 31 số có tổng = 1 số cho trước ( trùng cũng được ) vì mình có cộng việc là phải ghi hóa đơn 31 ngày và 1 ngày ngẫu nhiên 1 số khách sao cho 31 ngày phải cộng thành 1 tổng đã cho trước , cảm ơn ạ !
 
Upvote 0
Web KT

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

Back
Top Bottom