Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ sinh dãy số ngẫu nhiên trong khoảng

Chương trình đơn giản sử dụng rand() để sinh dãy 10 số nguyên ngẫu nhiên trong khoảng [1, 100].

Mã nguồn


#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
    int max_n = 100;
    int min_n = 1;
    int num;
    
    srand(time(nullptr));  // Seed bằng thời gian
    
    cout << "10 so ngau nhien [1, 100]:\n";
    for (int i = 0; i < 10; ++i) {
        num = min_n + rand() % (max_n - min_n + 1);
        cout << num << " ";
    }
    cout << endl;
}

Kết quả mẫu

10 so ngau nhien [1, 100]:
42 68 35 1 70 25 79 59 63 65

Cải tiến: Tránh modulo bias

rand() % N gây lệch phân phối nếu RAND_MAX không chia hết cho N. Cách khắc phục:


int rand_range(int min, int max) {
    int range = max - min + 1;
    int limit = RAND_MAX - (RAND_MAX % range);
    int r;
    do {
        r = rand();
    } while (r >= limit);
    return min + r % range;
}

C++11: Cách hiện đại (Khuyến nghị)


#include <iostream>
#include <random>

int main() {
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<> dist(1, 100);
    
    cout << "10 so ngau nhien [1, 100]:\n";
    for (int i = 0; i < 10; ++i) {
        cout << dist(gen) << " ";
    }
    cout << endl;
}

Ưu điểm <random>

  • Không modulo bias
  • Chất lượng ngẫu nhiên tốt (Mersenne Twister)
  • Thread-safe (mỗi thread dùng engine riêng)
  • Hỗ trợ nhiều phân phối (normal, exponential, poisson...)

Tóm tắt

  • Cách cũ: srand(time(0)) + rand() % range
  • Cách tốt hơn: Loại bỏ modulo bias với rejection sampling
  • Cách tốt nhất (C++11+): random_device + mt19937 + uniform_int_distribution