Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 20 kết quả

Đề tài: Giúp mình viết hàm này... random một mang từ mảng cho trước...

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    0

    Mặc định Giúp mình viết hàm này... random một mang từ mảng cho trước...

    Chào các bạn, mình là sv năm 2 nên còn hơi gà làm có bài tập làm wai hông ra, hic... có anh chị nào giúp e làm bài tập này với...
    Random một mảng từ cho trước với các kí tự không trùnng nhau...
    Ví dụ:a[] = {'a', 'b', 'c', 'd', 'e'}
    random ra mang b[] = {'b', 'c', 'a', 'e', 'd'}
    ai giúp em với nha...em cám ơn nhìu.... viết bằng c# nha...

  2. #2
    Ngày gia nhập
    12 2010
    Bài viết
    29

    Bạn thử này xem:
    Code:
     int temp = 0;
                string[] _a =  {"a","b","c","d","e"};
                List<int> _ls = new List<int> ();
                Random _rd = new Random();
    
                for (int i = 0; i < _a.Length; i++)
                {
                    do
                    {
                        temp = _rd.Next(_a.Length);
                    }
                    while (_ls.IndexOf(temp) != -1);
    
                    _ls.Add(temp);
                    Console.Write(_a[temp] + "\t");
                }
    
                Console.ReadKey();

  3. #3
    Ngày gia nhập
    09 2011
    Bài viết
    0

    cám ơn anh đã giải đáp dùm em, Nó vẫn còn 1 vấn đề chưa được giải quyết đó là phần tử vẫn còn bị trùng nhau vi du mang a="a,b,c,d" khi random ra no la b="c,b,d,a", phần tử b bị trùng ở vị trí thứ 2, anh có thể bắt điều kiện này được khôg a...

  4. #4
    Ngày gia nhập
    10 2010
    Nơi ở
    Unallocated Memory
    Bài viết
    46

    Giả sử a là mảng cho trước, b là mảng chứa kết quả random.


    Visual C# Code:
    1.             string[] a = { "a", "b", "c", "d", "e" };
    2.             string[] b = new string[a.Length];
    3.             int[] index = new int[a.Length];
    4.             Random rd = new Random();
    5.  
    6.             int i, j, k;
    7.  
    8.             for (i = 0; i < a.Length; i++) index[i] = i;
    9.  
    10.             for (i = 0; i < a.Length; i++)
    11.             {
    12.                 if (index[i] == i)
    13.                 {
    14.                     j = rd.Next(a.Length - 2);
    15.                     if (j >= i) j++;
    16.  
    17.                     k = index[i];
    18.                     index[i] = index[j];
    19.                     index[j] = k;
    20.                 }
    21.             }
    22.  
    23.             for (i = 0; i < a.Length; i++)
    24.             {
    25.                 b[i] = a[index[i]];
    26.             }
    Nghìn dặm phong ba cách tiếng lòng
    Vạn sầu thương nhớ nỗi hư không
    Nhìn phương xa ấy, mình ta ngóng
    Cố với tay theo một bóng hồng

  5. #5
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Convert mảng a thành List<int>
    Dùng random để lấy từng phần tử của List cho vào mảng b. Mỗi phần tử lấy xong thì loại ra khỏi List.

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

    Mặc định Giúp mình viết hàm này... random một mang từ mảng cho trước...

    Visual C# Code:
    1. char[] a = { 'a', 'b', 'c', 'd' };
    2. char[] b = new char[a.Length];
    3. List<char> li = new List<char>(a); // đổ mảng a vào list
    4. Random rand = new Random();
    5. int itm;
    6. for (int i = 0; i < b.Length; i++) // lấy random pt của list vào b
    7. {
    8.   itm = rand.Next(li.Count);
    9.   b[i] = li[itm];
    10.   li.RemoveAt(itm); // loại pt đã dùng
    11. }

  7. #7
    Ngày gia nhập
    10 2010
    Nơi ở
    Unallocated Memory
    Bài viết
    46

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Convert mảng a thành List<int>
    Dùng random để lấy từng phần tử của List cho vào mảng b. Mỗi phần tử lấy xong thì loại ra khỏi List.
    Làm theo cách bạn tớ thấy không ổn lắm vì đề yêu cầu là random không trùng nhau mà.
    Nghìn dặm phong ba cách tiếng lòng
    Vạn sầu thương nhớ nỗi hư không
    Nhìn phương xa ấy, mình ta ngóng
    Cố với tay theo một bóng hồng

  8. #8
    Ngày gia nhập
    02 2011
    Nơi ở
    Vô Gia Cư
    Bài viết
    269

    - tạo ra hai mảng : một mảng ban đầu và một mảng sau khi ramdom
    - mảng sau khi ramdom có độ dài = độ dài mảng ban đầu và giá trị từng phần tử là null
    - bạn dùng hàm ramdom để chọn vị trí mới cho phần tử, thỏa 2 điều kiện:
    + vị trí mới khác vị trí ban đầu
    + giá trị của phần tử tại vị trí mới = null
    nếu thỏa 2 điều kiện trên thì cho phần tử đó vào vị trí mới:

    Note*: bạn nên sử dụng lệnh while() để thực hiện hàm ramdom()

  9. #9
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Trích dẫn Nguyên bản được gửi bởi puss Xem bài viết
    Làm theo cách bạn tớ thấy không ổn lắm vì đề yêu cầu là random không trùng nhau mà.
    Chỉ 'thấy' không chưa đủ. Cần phải chứng mình.

    Giải thuật: Phần tử nào đã dùng rồi thì xóa mất. Lây đâu nữa mà trùng.

    Code: code trên đã được chạy thử rồi. Còn gì thắc mắc nữa không?

  10. #10
    Ngày gia nhập
    02 2011
    Nơi ở
    Vô Gia Cư
    Bài viết
    269

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Chỉ 'thấy' không chưa đủ. Cần phải chứng mình.

    Giải thuật: Phần tử nào đã dùng rồi thì xóa mất. Lây đâu nữa mà trùng.

    Code: code trên đã được chạy thử rồi. Còn gì thắc mắc nữa không?

    code của bạn có bị mắc phải lỗi sau không?
    - giả sử mảng có 11 phần tử, khi dùng hàm ramdom chọn vị trí mới thì 10 phần tử đầu tiên hoán đổi vị trí cho nhau đến vị trí cuối cùng thì nó không biết hoán đổi cho vị trí nào cả!

    - mà code của bạn vẫn còn trường hợp là vị trí mới trùng với vị trí ban đầu! cần kiểm tra thêm itm có khác i nữa không?

    Code:
                Console.WriteLine("Moi ban nhap mang ki tu");
                Char[] i = Console.ReadLine().ToCharArray();
                Char[] o = new Char[i.Length];
                for (int t = 0; t < o.Length; t++)
                    o[t] = ' ';
                Console.WriteLine("Moi ban nhap A de ramdom mang ki tu");
                if (Console.ReadKey().Key == ConsoleKey.A)
                {
                    for (int t = 0; t < i.Length; t++)
                    {
                        int a = 0;                
                        while(true)
                        {
                            a = (new Random()).Next(0, i.Length);
                            if(a != t && o[a] == ' ')
                            {
                                o[a] = i[t];
                                break;
                            }
                        }
                    }
                }
                string outstring = "";
                foreach(Char sd in o)
                {
                    outstring += sd.ToString();
                }
                Console.WriteLine("\n"+outstring);
                Console.ReadKey();
    Code của mình chưa fix được lỗi : "nếu mảng có nhiều phần tử thì có thể xảy ra trường hợp phần tử cuối cùng không tìm được vị trí khác vị trí ban đầu của nó!" (xác suất thấp nhưng vẫn có)
    Đã check lỗi trùng vị trí!
    Đã được chỉnh sửa lần cuối bởi Click8A4 : 13-09-2011 lúc 01:17 PM.

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

  1. Mã nguồn C Lỗi Chương trình người bán hàng sai ở hàm random, giúp mình kiểm tra lỗi với!
    Gửi bởi caphetim trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 24-06-2012, 10:18 PM
  2. Bài tập C++ Giúp mình viết 1 đoạn code hoàn chỉnh trong C++ về random trong giới hạn
    Gửi bởi sai211dn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 06-10-2011, 08:01 PM
  3. Không hiểu code create 1 string random, giúp mình
    Gửi bởi ptnhuan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 22-09-2010, 11:12 AM
  4. Cần giúp về hàm random và xắp xếp
    Gửi bởi dungphi_63 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 09-09-2009, 08:59 AM
  5. Sai khi sử dụng hàm Random. Sửa giúp mình với!
    Gửi bởi mèo lười trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 30-12-2008, 09:08 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