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ố 13 kết quả

Đề tài: Làm thế nào để tạo được số ngẫu nhiên có n chữ số ???

  1. #1
    Ngày gia nhập
    04 2017
    Bài viết
    1

    Mặc định Làm thế nào để tạo được số ngẫu nhiên có n chữ số ???

    em đang được giao bài tập như vậy nhưng đang bí ý tưởng :(( số ngẫu nhiên có n chữ số vd như: n=10 thì là số có 10 chữ số 1234567894,... please help :((

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

    Nếu số chữ số đủ nhỏ, cho trâu cày thử xem - random từng vị trí :
    C Code:
    1. #include<time.h>
    2. int Random(int nDigit)          // nDigit : số chữ số. Điều kiện 0 < nDigit < 10 trên máy có sizeof(int) = 4
    3. {
    4.     int     i, k, iReturn = 0;
    5.  
    6.     srand((unsigned int)time(0));
    7.     for (i = 0, k = 1; i < nDigit - 1; i++, k *= 10)
    8.         iReturn += (rand() % 10) * k;
    9.     iReturn += (rand() % 9 + 1) * k;        // Bảo đảm số đầu tiên khác không để dãy số có nghĩa
    10.     return iReturn;
    11. }
    Yêu mã hơn yêu em !!!

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Với n <= 9 thì có thể sinh một số ngẫu nhiên trong khoảng [0, 2 000 000 000). Cách này hiệu quả hơn, vì thường chỉ cần gọi rand() một phát thôi.

    Mã nguồn:

    http://diendan.congdongcviet.com/threads/t8778::thuat-toan-tim-so-ngau-nhien-khong-su-dung-ham-rand.cpp?p=47610#post47610
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    755

    Các kỹ thuật với C++ mà bạn nêu quả thực là áp dụng cho bình diện lớn hơn (bao trùm cả câu hỏi của chủ top). Mình chưa kiểm tra hết các lớp liên kết nhau nên hỏi thêm bạn vài ý.
    _ Với n <= 9 thì có thể sinh một số ngẫu nhiên trong khoảng [0, 2 000 000 000). Như vậy là cũng phải thêm vào thuật toán để ép số sinh ra đủ chữ số mong muốn như đề bài ?
    _ Hàm ngẫu nhiên chiếm thời gian chạy rất dài nên bất đắc dĩ mới dùng nó, về điểm này mình đồng ý với bạn.
    Yêu mã hơn yêu em !!!

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

    Trị tối đa của hàm rand (RAND_MAX) thường là trị tối đa của số nguyên.
    Như vậy, tùy hệ thống mà ta có thể coi nó tối đa là 9 hay 4 chữ số.
    Trị số căn bản trong máy tính chỉ chính xác đến 15 chữ số, số nguyên hay số thực cũng bấy nhiêu thôi.

    Muốn giải bài này thì cần viết một hàm trả về số ngẫu nhiên n chữ số. 1 <= n <= MAX chữ số.
    Nếu số chữ số cần thiết cao hơn giới hạn của hàm thì gọi hàm nhiều lần và ghép số lại. so = nn(MAX) + nn(n-MAX)*10^MAX + ...
    Nếu chữ số cần thiết cao hơn 15 thì bắt buộc phải dụng dạng số tự chế ra - very long number chẳng hạn.

  6. #6
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    755

    Mặc định Làm thế nào để tạo được số ngẫu nhiên có n chữ số ???

    Bạn nói đúng, chính vì vậy nên mình có comment trong mã để chủ thớt chú ý. Còn vấn đề gọi hàm rand() chỉ một lần như Ada góp ý, mình đưa 1 đoạn khác các bạn xem thử :
    C Code:
    1. int Random2(int nDigit)         // nDigit : số chữ số. Điều kiện 0 < nDigit < 10 trên máy có sizeof(int) = 4
    2. {
    3.     int         i, iSmall = 1;
    4.  
    5.     srand((unsigned int)time(0));   // Câu lệnh này nên đặt ở nơi gọi
    6.  
    7.     for (i = 0; i < nDigit - 1; i++)
    8.         iSmall *= 10;           // Số nhỏ nhất làm cận dưới, vd nDigit = 5 thì iSmall sẽ = 10000 và có đủ 5 chữ số
    9.     return (rand() % (iSmall * 9) + iSmall);    // gọi rand() chỉ 1 lần
    10. }
    Yêu mã hơn yêu em !!!

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    _ Với n <= 9 thì có thể sinh một số ngẫu nhiên trong khoảng [0, 2 000 000 000). Như vậy là cũng phải thêm vào thuật toán để ép số sinh ra đủ chữ số mong muốn như đề bài ?
    Code mình đưa (xem link) đã chứa sẵn thuật toán. Thuật toán "của mình" dùng toán tử / (phép chia) hơn là toán tử % (modulo).

    Nhưng code ấy chỉ gọi một phiên bản rand() sinh số ngẫu nhiên 32 bit nên chỉ giải quyết vấn đề cho n <= 9. Nếu yêu cầu đến n <= 18 thì có thể kết hợp code của mình với code của bạn, dùng kiểu 64 bit. Một số môi trường hỗ trợ số nguyên đến 128 bit, giải quyết được đến n ~ 36.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

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

    hàm lấy số ngẫu nhiên ngoài tính bất định (mỗi lúc mỗi khác, không tất định) còn phải phân bố đều trong miền xác định, dùng được trong thống kê.

  9. #9
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    hàm lấy số ngẫu nhiên ngoài tính bất định (mỗi lúc mỗi khác, không tất định) còn phải phân bố đều trong miền xác định, dùng được trong thống kê.
    Đúng vậy. Nếu không để ý, có thể vô tình làm mất tính chất quan trọng này khi lấy số ngẫu nhiên trong khoảng yêu cầu nhất định.

    Ví dụ, giả sử cần lấy một số ngẫu nhiên 2 chữ số. Giả sử rand() trả lại giá trị (phân bố đều) trong khoảng [0,256), nghĩa là mỗi giá trị có tần suất 1/256. Nếu dùng công thức rand() % 100, giá trị trả lại sẽ chạy trong khoảng [0,100), nhưng phân bố không đều: tần suất có lúc là 2/256, có lúc lại là 3/256.

    Để đảm bảo được phân bố đều, vấn đề ở đây không phải là dùng toán tử r%m hay r/q (r là biến ngẫu nhiên). Vấn đề là khoảng giá trị (phân bố đều) của r phải thế nào kia.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  10. #10
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    755

    Vấn đề cốt lõi là người ta không thực sự tạo được số (dãy số) ngẫu nhiên trên máy tính (đơn giản là phải có thuật toán - đồng nghĩa với không ngẫu nhiên) mà chỉ cố gắng tạo được số (dãy số) có được càng nhiều tính chất của số ngẫu nhiên càng tốt. Ngay cả các thuật toán tạo số ngẫu nhiên trước đây được xem là tốt thì ngày nay người ta lại chứng minh được sự thoái hóa khi phân bố trong miền xác định (phân bố không đều, có chu kỳ, ...). Với sức mạnh ngày càng tăng của máy tính, có lẽ ngay cả hàm srand-rand ta đang dùng cũng sẽ bị tìm ra yếu điểm.

    Hiện tại thì mình chưa nghĩ ra phương cách nào để giải quyết bài toán của chủ đề tài mà không phải dùng rand()%x, mời các bạn tham gia bằng mã cụ thể càng tốt.
    Yêu mã hơn yêu em !!!

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