Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Cách chọn random theo xác suất?

  1. #1
    Ngày gia nhập
    05 2010
    Bài viết
    6

    Mặc định Cách chọn random theo xác suất?

    - Chào các bạn! Giả sử mình có 1 mẫu gồm 10 phần tử (biến) độc lập với xác suất chọn lựa biết trước và có thể khác nhau, tổng xác suất có thể khác 1 (vì các biến độc lập). Mình muốn chọn ra 1 (hoặc hơn nếu nhiều hơn 1 biến có xác suất = 1) biến theo xác suất, các bạn giúp mình!

  2. #2
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Do các trường có sác xuất độc lập, nên bạn tính xác xuất chung lại với nhau để ra giá trị phần trăm (%)

    Visual C# Code:
    1.  
    2. A[0](GT = 120, SX = 300);
    3. A[1](GT = 32554, SX = 12);
    4. A[2](GT = 21122012, SX = 67);
    5. A[3](GT = 36, SX = 234);
    6. A[4](GT = 99, SX = 66);
    7.  
    8. SX_Chung = 0;
    9. for (int i = 0; i < A.Length; i++) {
    10.     SX_Chung += A[i].SX;
    11. }
    12.  
    13. for (int i = 0; i < A.Length; i++) {
    14.     A[i].SX = A[i].SX * 100 / SX_Chung; // Cho ra dạng %
    15. }
    16.  
    17. // SX_Chung = 679;

    Khi này đã đưa về dạng % chung:
    Visual C# Code:
    1. a[0].SX: 44.18%;
    2. a[1].SX: 1.77%;
    3. a[2].SX: 9.87%;
    4. a[3].SX: 34.46%;
    5. a[4].SX: 9.72%;

    Lấy Ramdom từ 0 - 100 (xem như là là %)
    Nó rơi vào thằng nào thì lấy thằng đó )

    Nhưng bạn cũng bỏ qua cái % đó đi, cho nó ra số ngẫu nhiên từ 0 - SX_Chung thì hay hơn.


    Lưu ý: Đây chỉ là mã câu trúc - sơ đồ, không phải là mã của C#
    Đã được chỉnh sửa lần cuối bởi SITUVNX : 20-12-2012 lúc 12:22 PM.

  3. #3
    Ngày gia nhập
    05 2010
    Bài viết
    6

    Cám ơn bạn nha!(Không thấy nút thank đâu hêt) Mình làm được rồi, nhưng chưa biết thực sự tối ưu chưa!
    Code:
    Ví dụ: a[max]
    a[0]=1 //giá trị là xác suất
    a[1]=2
    a[2]=3
    TongXS=6
    //tạo mảng mới b[max+1];
    b[0]=0;
    b[1]=1;//=a[0]
    b[2]=3;//=a[0]+a[1]
    b[3]=6;//=a[0]+a[1]+a[2]
    iRan = ran.Next(0; TongXS);
    for i = 0 to max do
        if (b[i] =< iRan < b[i+1])
            iChoose = i;
            break;
    
    vậy a[choose] chính là biến được chọn.

  4. #4
    Ngày gia nhập
    08 2012
    Bài viết
    574

    He he, đúng rồi, nhưng bạn viết bằng ngôn ngữ gì thế? (VB à), mình tưởng viết bằng C#, vì bạn hỏi ở diễn đàn C#.

  5. #5
    Ngày gia nhập
    04 2012
    Bài viết
    116

    Trích dẫn Nguyên bản được gửi bởi SITUVNX Xem bài viết
    He he, đúng rồi, nhưng bạn viết bằng ngôn ngữ gì thế? (VB à), mình tưởng viết bằng C#, vì bạn hỏi ở diễn đàn C#.
    giống như vb hay sao ấy, vb với c# là anh em, học vb.net khác gì mấy so với c#

  6. #6
    Ngày gia nhập
    05 2010
    Bài viết
    6

    Mặc định Cách chọn random theo xác suất?

    Sặc, mình viết bằng C# còn mã trên mã tào lao đó, để đọc dễ hiểu thôi.

  7. #7
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Hơ hơ, vậy giống mình à ). Vậy thì cũng để cái cảnh báo chứ )

  8. #8
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Đây là phương thức mình làm để chọn số ngẫu nhiên dựa vào xác xuất

    Visual C# Code:
    1. public static int Random(params int[] Values) {
    2.     int TotalProb = 0;
    3.     for (int i = 0; i < Values.Length; i++) {
    4.         if (Values[i] <= 0) throw new ArgumentException("Each value must positive number and larger than zero.");
    5.         TotalProb += Values[i];
    6.     }
    7.     int Random = new Random().Next(0, TotalProb);
    8.     int Temp = 0;
    9.     for (int i = 0; i < Values.Length; i++) {
    10.         if (Random <= (Temp += Values[i])) return i;
    11.     }
    12.     return -1;
    13. }
    Đã được chỉnh sửa lần cuối bởi SITUVNX : 20-12-2012 lúc 08:55 PM.

  9. #9
    Ngày gia nhập
    05 2010
    Bài viết
    6

    Thank bạn! Code bạn pro hơn mình :P

Các đề tài tương tự

  1. Kỹ thuật C Tại sao hàm random cho nhiều số thì kết quả random bị trùng lặp?
    Gửi bởi acquydem12 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 18-04-2014, 02:17 PM
  2. Hàm random không xác định trong dev-C ,cách tạo số random
    Gửi bởi khymkb trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 02-04-2013, 12:10 PM
  3. Xin hướng dẫn Random theo từng cặp cho nhãn Button
    Gửi bởi SangNguyen2603 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 6
    Bài viết cuối: 08-03-2013, 03:33 PM
  4. Trả lời: 0
    Bài viết cuối: 06-07-2012, 11:07 AM
  5. Sắp xếp ký tự trong xâu theo độ giảm tần suất xuất hiện chúng
    Gửi bởi kitti trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 19-10-2010, 08:27 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn