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

Sinh số ngẫu nhiên trong khoảng cho trước trong C

Hàm rand() trong C chỉ sinh số ngẫu nhiên từ 0 đến RAND_MAX. Để sinh số trong khoảng [min, max], ta dùng công thức toán học đơn giản.

Công thức

random = (rand() % (max - min + 1)) + min;
  • rand() % (max - min + 1) cho giá trị 0 .. (max-min).
  • Cộng min dịch chuyển về khoảng [min, max].

Khởi tạo seed (hạt giống)

Dùng srand(time(0)) để seed bằng thời gian hiện tại (giây từ epoch), đảm bảo dãy số khác nhau mỗi lần chạy. Chỉ gọi srand một lần ở đầu chương trình.

Ví dụ hoàn chỉnh

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// Hàm sinh 'count' số ngẫu nhiên trong [l, r]
void generate_random(int l, int r, int count) {
    for (int i = 0; i < count; i++) {
        int rand_num = (rand() % (r - l + 1)) + l;
        printf("%d ", rand_num);
    }
}

int main() {
    int lower = 10, upper = 15, count = 15;
    
    srand(time(0)); // Seed bằng thời gian hiện tại
    
    printf("15 so ngau nhien trong [%d, %d]:\n", lower, upper);
    generate_random(lower, upper, count);
    printf("\n");
    
    return 0;
}

Kết quả mẫu

15 so ngau nhien trong [10, 15]:
15 11 13 10 13 10 15 11 14 12 12 13 12 13 14

⚠️ Hạn chế của rand()

  • Phân phối không đồng đều hoàn hảo (modulo bias) khi RAND_MAX không chia hết cho (max-min+1).
  • Không phù hợp cho mật mã học (cryptography).
  • Chu kỳ lặp ngắn, chất lượng ngẫu nhiên thấp.

Giải pháp tốt hơn (C++11 trở lên)

#include <random>
#include <iostream>

int main() {
    std::random_device rd;                     // Nguồn entropy phần cứng
    std::mt19937 gen(rd());                    // Mersenne Twister engine
    std::uniform_int_distribution<> dist(10, 15); // Phân phối đều [10,15]
    
    for (int i = 0; i < 15; ++i)
        std::cout << dist(gen) << ' ';
    return 0;
}

Với C thuần, rand() vẫn đủ dùng cho bài tập, mô phỏng đơn giản. Với ứng dụng yêu cầu chất lượng ngẫu nhiên cao, hãy dùng <random> của C++.