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

Đề tài: Chương trình xuất ra nhiều dãy số ngẫu nhiên, số trong mỗi dãy không trùng nhau

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

    Mặc định Chương trình xuất ra nhiều dãy số ngẫu nhiên, số trong mỗi dãy không trùng nhau

    Giả sử cần xuất ra 3 dãy số ngẫu nhiên trong khoảng 1 đến 10, mỗi dãy gồm 4 số, ví dụ:
    2 3 6 8
    3 6 8 9
    1 5 7 9
    Yêu cầu là mỗi số trong 1 dãy không trùng nhau, giữa 2 dãy có thể có số giống nhau. Kiểu giống như chọn số trong vietlott vậy ạ.
    Mình chỉ viết đựoc đoạn code xuất ra được 1 dãy như phía dưới, ai có thể giúp mình xuất ra 3 dãy 1 lúc không ạ?
    Code:
    #include <iostream>
    using namespace std;
    #include <stdlib.h>
    #include <map>
    #include <time.h>
     
    int chonso()
    	{
    	    srand((int)time(0));
    	    int r;
    	    int minn=1;
    	    int maxx=10;
    	    map<int, bool> vis;
        for(int i = 0; i < 4; ++i)
    		{
            do{
                r = minn + rand() % (maxx + 1 - minn);
            }while(vis.find(r) != vis.end());
            cout<< r << " ";
            vis[r] = true;
            
        }
    }
    int main()
    {
    	cout<< "Day so ngau nhien la: \n \n";
    		chonso();
    	cout<<"\n \n";
    }
    Và kết quả ra là:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		ketqua.png
Lần xem:	2
Size:		6.8 KB
ID:		74372

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    1,005

    Trích dẫn Nguyên bản được gửi bởi bigsmile Xem bài viết
    Giả sử cần xuất ra 3 dãy số ngẫu nhiên trong khoảng 1 đến 10, mỗi dãy gồm 4 số, ví dụ:
    2 3 6 8
    3 6 8 9
    1 5 7 9
    Yêu cầu là mỗi số trong 1 dãy không trùng nhau, giữa 2 dãy có thể có số giống nhau. Kiểu giống như chọn số trong vietlott vậy ạ.
    Mình chỉ viết đựoc đoạn code xuất ra được 1 dãy như phía dưới, ai có thể giúp mình xuất ra 3 dãy 1 lúc không ạ?
    Code:
    #include <iostream>
    using namespace std;
    #include <stdlib.h>
    #include <map>
    #include <time.h>
     
    int chonso()
    	{
    	    srand((int)time(0));
    	    int r;
    	    int minn=1;
    	    int maxx=10;
    	    map<int, bool> vis;
        for(int i = 0; i < 4; ++i)
    		{
            do{
                r = minn + rand() % (maxx + 1 - minn);
            }while(vis.find(r) != vis.end());
            cout<< r << " ";
            vis[r] = true;
            
        }
    }
    int main()
    {
    	cout<< "Day so ngau nhien la: \n \n";
    		chonso();
    	cout<<"\n \n";
    }
    Và kết quả ra là:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		ketqua.png
Lần xem:	2
Size:		6.8 KB
ID:		74372
    Đoạn mã bên dưới dùng vector thay vì map, dùng các trường hợp tổng quát hơn cũng như tách biệt dữ liệu ra khỏi phần hiển thị.
    C++ Code:
    1. #include <iostream>
    2. #include <time.h>
    3. #include <vector>
    4. using namespace std;
    5.  
    6. vector<vector<int>> chonso(int rows, int cols)
    7. {
    8.     vector<vector<int>> ret(rows, vector<int>(0));
    9.     bool    b;
    10.     int     num;
    11.     for (int row = 0; row < rows; row++)
    12.     {
    13.         for (int col = 0; col < cols; col++)
    14.         {
    15.             do
    16.             {
    17.                 b = false;
    18.                 num = rand() % 10 + 1;              // Tạo số Từ 1 -> 10
    19.                 for (int c = 0; c < col; c++)
    20.                     if (ret[row][c] == num)         // Kiểm tra với các số đã có trước trong dãy
    21.                     {
    22.                         b = true;                   // Bật cờ báo trùng số
    23.                         break;
    24.                     }
    25.                 if (!b)                             // Nếu không trùng ...
    26.                     ret[row].push_back(num);        // ... thì lấy số này
    27.             } while (b);
    28.         }
    29.     }
    30.     return ret;
    31. }
    32. void inso(vector<vector<int>> vtSo)
    33. {
    34.     int     rows = (int)vtSo.size();
    35.     int     cols = (int)vtSo[0].size();
    36.     cout << " Cac day so ngau nhien [" << rows << "][" << cols << "] : \n\n";
    37.     for (int row = 0; row < rows; row++)
    38.     {
    39.         for (int col = 0; col < cols; col++)
    40.             cout << " " << vtSo[row][col];
    41.         cout << endl;
    42.     }
    43.     cout << "\n ";
    44. }
    45. int main()
    46. {
    47.     srand((int)time(0));
    48.     int     so_day = rand() % 8 + 3;            // Số dãy cần xuất [3,10]. Hoặc lấy cố định = 3 như đề bài.
    49.     int     so_chu = rand() % 5 + 4;            // Số chữ số trong dãy [4,8]. Hoặc lấy cố định = 4 như đề bài.
    50.     vector<vector<int>> vtSo = chonso(so_day, so_chu);
    51.     inso(vtSo);
    52.  
    53.     system("pause");
    54.     return 0;
    55. }


    .
    .

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

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Đoạn mã bên dưới dùng vector thay vì map, dùng các trường hợp tổng quát hơn cũng như tách biệt dữ liệu ra khỏi phần hiển thị.
    .............
    .............

    .
    .
    Được rồi ạ, cảm ơn bạn rất nhiều!
    Attached Thumbnails Attached Thumbnails pppp.jpg  
    Đã được chỉnh sửa lần cuối bởi bigsmile : 10-01-2022 lúc 06:54 PM. Lý do: thay doi

  4. #4
    Ngày gia nhập
    02 2016
    Bài viết
    334

    Code màu mè vec to tùm lum nhưng thuật toán thì dở.
    Thuật toán kinh điển của bốc ngẫu nhiên không trùng là bốc và swap vị trí.

    0 1 2 3 4 5 6 7 9

    1. Random khoảng 0-9. Giả sử được số 3
    swap 3 với 0 (vị trí thứ nhất)
    3 1 2 0 4 5 6 7 9

    2. Random khoảng 1-9. Giả sử được số 6
    swap 6 với 1 (vịt trí thứ 2)
    3 6 2 0 4 5 1 7 9

    Cứ thế, sau 4 lượt thì được 4 số không trùng.

    Vec to hay mảng gì đó chỉ là cách thực hiện cấu trúc của dãy số.

  5. #5
    Ngày gia nhập
    01 2022
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi NguNhuheo Xem bài viết
    Code màu mè vec to tùm lum nhưng thuật toán thì dở.
    Thuật toán kinh điển của bốc ngẫu nhiên không trùng là bốc và swap vị trí.

    0 1 2 3 4 5 6 7 9

    1. Random khoảng 0-9. Giả sử được số 3
    swap 3 với 0 (vị trí thứ nhất)
    3 1 2 0 4 5 6 7 9

    2. Random khoảng 1-9. Giả sử được số 6
    swap 6 với 1 (vịt trí thứ 2)
    3 6 2 0 4 5 1 7 9

    Cứ thế, sau 4 lượt thì được 4 số không trùng.

    Vec to hay mảng gì đó chỉ là cách thực hiện cấu trúc của dãy số.
    Bạn có thể cho mình xin đoạn code được không ạ

  6. #6
    Ngày gia nhập
    02 2016
    Bài viết
    334

    Mặc định Chương trình xuất ra nhiều dãy số ngẫu nhiên, số trong mỗi dãy không trùng nhau

    #include <iostream>
    #include <time.h>

    // function to pick nm distinct numbers from an array of ln numbers
    void PickRandNums(int *a, int ln, int nm) {
    int pos, tmp;
    for (int upper = ln-1, lower = 0; lower < nm; lower++ ) {
    pos = (rand() % (upper - lower + 1)) + lower;
    tmp = a[pos];
    a[pos] = a[lower];
    a[lower] = tmp;
    }
    }

    // code to test the above function
    int main() {
    int totNum = 4;
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    srand(time(NULL));
    for (int lin = 1; lin <= 3; lin++) { // 3 sets to be generated
    PickRandNums(a, 10, totNum);
    for (int i = 0; i < totNum; i++) std::cout << a[i] << " ";
    std::cout << std::endl;
    }
    return 0;
    }

  7. #7
    Ngày gia nhập
    01 2022
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi NguNhuheo Xem bài viết
    #include <iostream>
    #include <time.h>

    // function to pick nm distinct numbers from an array of ln numbers
    void PickRandNums(int *a, int ln, int nm) {
    int pos, tmp;
    for (int upper = ln-1, lower = 0; lower < nm; lower++ ) {
    pos = (rand() % (upper - lower + 1)) + lower;
    tmp = a[pos];
    a[pos] = a[lower];
    a[lower] = tmp;
    }
    }

    // code to test the above function
    int main() {
    int totNum = 4;
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    srand(time(NULL));
    for (int lin = 1; lin <= 3; lin++) { // 3 sets to be generated
    PickRandNums(a, 10, totNum);
    for (int i = 0; i < totNum; i++) std::cout << a[i] << " ";
    std::cout << std::endl;
    }
    return 0;
    }
    Rất hay ạ, cảm ơn bạn nhiều nha

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