Bài tập VBA: tạo một dãy số sao cho các số không trùng nhau??

Liên hệ QC

Quy Vu

Thành viên chính thức
Tham gia
4/8/17
Bài viết
65
Được thích
4
Giới tính
Nam
Chào các anh chị trong diễn đàn,
Em có một bài tập muốn nhờ các anh chị giúp đỡ, mong được hỗ trợ ạ
- Điền một số ngẫu nhiên từ 1 tới 59 vào 6 ô liền nhau bất kì như dưới, sao cho 6 số này không số nào trùng nhau?

- 215890
 
Chắc bác định nói tới Randomize
Đúng rồi bác.

@các bạn khác:
Code ở bài #2 viết lúc tác giả chưa nắm vững về random.
Không có randmize thì ngẫu nhiên là giả định. Bạn chạy nhiều lần sẽ thấy mỗi lần đều ra kết quả như nhau.

Gò mãi mới về được 9 dòng. Hóng code 5 dòng
...
Có thể hóng hơi lâu. Hiện giờ người ta còn chờ mấy thằng LTV Xê Cọng Cọng vào quán đánh bi da, hỏi lại chúng xem cái "Big O" mà tôi nói ở trên là cái quái gì trong Xê Cọng Cọng. Sau đó mới nhờ mấy thằng kia cho một cái link lên đâu đó chụp hình code mang về (chắc lần này né GeeksForGeeks)

Các ngôn ngữ chuẩn tổng quát còn tồn tại được đến ngày nay là do chúng có thư viện rộng lớn và mạnh mẽ.
Loại bài chuyên toán xác suất thống kê như thế này chúng có 1 đống hàm/class thư viện.
Chỉ cần tạo 1 đối tượng dạng list, gọi hàm random shuffle, và lấy ra mấy phần tử. Đối với C++ thì thuật toán này coi như độ phức tạp tỷ lệ thuận bình thường.
Bài #2 ở trên theo độ phức tạp luỹ thừa. Code đơn giản nhưng số n càng nhiều thì càng bị lặp lại, và như bài #16 nói, nếu n gần bằng m (m - n tiến về 0) thì có khả năng chạy từ sáng đến chiều.
VBA là ngôn ngữ ứng dụng cho nên người ta không có những hàm hổ trợ chuyên lập trình toán. Chỉ có thế thôi.

Chú: nếu bạn gì đó chuyên quảng cáo Python vào đây thì bạn ấy có lẽ sẽ biểu diễn cho quý vị thấy Python làm trong vòng 3 dòng. Loại bài toán cơ bản như thế này thì các ngôn ngữ mới có thể dùng lambda để giảm thiểu số dòng code.

Chú 2: tác giả bài #2 về sau này học được thuật toán hoàn chỉnh hơn, quý vị chịu khó tìm.
 
Upvote 0
Đúng rồi bác.

@các bạn khác:
Code ở bài #2 viết lúc tác giả chưa nắm vững về random.
Không có randmize thì ngẫu nhiên là giả định. Bạn chạy nhiều lần sẽ thấy mỗi lần đều ra kết quả như nhau.


Có thể hóng hơi lâu. Hiện giờ người ta còn chờ mấy thằng LTV Xê Cọng Cọng vào quán đánh bi da, hỏi lại chúng xem cái "Big O" mà tôi nói ở trên là cái quái gì trong Xê Cọng Cọng. Sau đó mới nhờ mấy thằng kia cho một cái link lên đâu đó chụp hình code mang về (chắc lần này né GeeksForGeeks)

Các ngôn ngữ chuẩn tổng quát còn tồn tại được đến ngày nay là do chúng có thư viện rộng lớn và mạnh mẽ.
Loại bài chuyên toán xác suất thống kê như thế này chúng có 1 đống hàm/class thư viện.
Chỉ cần tạo 1 đối tượng dạng list, gọi hàm random shuffle, và lấy ra mấy phần tử. Đối với C++ thì thuật toán này coi như độ phức tạp tỷ lệ thuận bình thường.
Bài #2 ở trên theo độ phức tạp luỹ thừa. Code đơn giản nhưng số n càng nhiều thì càng bị lặp lại, và như bài #16 nói, nếu n gần bằng m (m - n tiến về 0) thì có khả năng chạy từ sáng đến chiều.
VBA là ngôn ngữ ứng dụng cho nên người ta không có những hàm hổ trợ chuyên lập trình toán. Chỉ có thế thôi.

Chú: nếu bạn gì đó chuyên quảng cáo Python vào đây thì bạn ấy có lẽ sẽ biểu diễn cho quý vị thấy Python làm trong vòng 3 dòng. Loại bài toán cơ bản như thế này thì các ngôn ngữ mới có thể dùng lambda để giảm thiểu số dòng code.

Chú 2: tác giả bài #2 về sau này học được thuật toán hoàn chỉnh hơn, quý vị chịu khó tìm.
Rỏ hơn, code có khả năng chạy mãi mãi không dừng:
Loop Until .Count = Amount
 
Upvote 0
Rỏ hơn, code có khả năng chạy mãi mãi không dừng:
Loop Until .Count = Amount
Đúng thế, lý do là....giải theo kiểu này, Giải kiểu khác, loại ngay "thằng" vừa lấy, số vòng chạy bằng đúng số lượng số muốn lấy (trong bài là 6)
Thân
 
Upvote 0
Rỏ hơn, code có khả năng chạy mãi mãi không dừng:
Loop Until .Count = Amount
Trong thớt nói về bài toán này, khoảng hơn 1 năm trước, tôi có nói về vấn đề này rồi. Theo toán xác suất thì thuật toán này sẽ có khả năg chạy hoài không dừng khi n là số khá lớn và (m-n)/n là số khá nhỏ. (bốc n trong m số)

Chú: (cũng có thể ý bạn là chỗ này) theo kinh nghiệm viết code thì dòng
Do
...
Loop Until .Count = Amount

cũng được coi là code a ma tơ.
Người lão luyện trong nghề code viết vòng lặp đếm là
Loop Until .Count >= Amount
Mục đích để tránh sai sót. Nếu vì lý do gì, con số Amount là 0 thì code cũng chạy sáng đến tối.
Cách đúng đắn hơn thì phải là
Do While .Count < Amount
...
Loop

Giải thích:
Vòng lặp bình thường thì phải tét điều kiện ngay đầu.
Chỉ dùng vòng lặp tét điều kiện ở cuối khi muốn nó BẢO ĐẢM chạy ít nhất 1 lần.
 
Upvote 0
Web KT
Back
Top Bottom