Giúp mình công thức về random (2 người xem)

Liên hệ QC

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

lshunter

Thành viên mới
Tham gia
21/4/15
Bài viết
3
Được thích
0
Mình muốn tạo 1 danh sách các số random sao cho khi tổng số trùng với 1 ô cho trc thì dừng lại. Các số có thể trùng, là số nguyên (1,3,6,9). Giúp mình với
 
Mình muốn tạo 1 danh sách các số random sao cho khi tổng số trùng với 1 ô cho trc thì dừng lại. Các số có thể trùng, là số nguyên (1,3,6,9). Giúp mình với
Gọi số cho trước tại 1 ô cho trước là N.
Gọi số lượng các số tương ứng với (1,3,6,9) là (a,b,c,d), với a,b,c,d >= 0.

Giải phương trình sau tìm được các nghiệm a,b,c,d sẽ lập được danh sách cần tìm:
1*a + 3*b + 6*c + 9*d = N

Chiếu xong phim!
 
Bài này nếu số nguyên thì giải dược nhưng số có thập phân thì không.
n(1) = randbetween(1, N)
n(2) = randbetween(1, N - n(1))
n(3) = randbetween(1, N - n(1) - n(2))
...
Rất đơn giản nếu cho phép số lặp lại. Bởi vì số sẽ có khuynh hướng hội tụ về 1.

Nếu không cho số lặp lại thì lập thêm phần dò trong mảng đã ra. Tuy nhiên vì không lặp lại cho nên không thể dựa vào luật hội tụ về số nhỏ (và chận ở 1) được - số nhỏ (và số 1) có thể đã ra rồi. Trường hợp này thì phải thêm phần xét dể dừng lại trước khi vô nghiệm.
Điển hình ví dụ: Nếu số 2 ra rồi thì
N - n(1) - n(2) - ... n(i) = 2 là bế tắt. Số cuối không thể là 2 và tách ra thành 2 số 1 cũng không được.
Đây là đề bài không dễ. Bạn nào muốn thử sức?

Chú: theo dạng công thức trên thì có thể gọn đẹp bằng đệ quy.
 
Bài giải cho phép lặp số. Code tượng trưng:
Mã:
Function DaySo(byVal N As Long) As String
' tìm ngẫu nhiên một dãy số nguyên mà tổng là N
Randomize ' nếu máy rất mạnh thì chỉ nên seed 1 lần thôi, dùng static flag
Dim so As Long
Do While N > 0
  so = Int(N * Rnd) + 1 ' ngẫu nhiên 1 số nguyên giữa 1 và N
  DaySo = DaySo & " " & so
  N = N - so
Loop
If Len(DaySo) Then
  DaySo = Trim(DaySo)
Else
  DaySo = "0"
End If
End Function
 
Web KT

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

Back
Top Bottom