Vấn đề là sự bổ sung. rand()
trả về một int
giá trị của 0...RAND_MAX
. Vì vậy, nếu bạn thêm hai trong số họ, bạn sẽ nhận được RAND_MAX * 2
. Nếu vượt quá INT_MAX
, kết quả của bổ sung sẽ vượt quá phạm vi hợp lệ mà an int
có thể giữ. Tràn đầy các giá trị đã ký là hành vi không xác định và có thể dẫn đến bàn phím của bạn nói chuyện với bạn bằng tiếng nước ngoài.
Vì không có lợi ở đây khi thêm hai kết quả ngẫu nhiên, ý tưởng đơn giản là không làm điều đó. Ngoài ra, bạn có thể truyền từng kết quả unsigned int
trước khi bổ sung nếu điều đó có thể giữ tổng. Hoặc sử dụng một loại lớn hơn. Lưu ý rằng long
không nhất thiết phải rộng hơn int
, tương tự áp dụng cho long long
nếu int
ít nhất là 64 bit!
Kết luận: Chỉ cần tránh bổ sung. Nó không cung cấp thêm "tính ngẫu nhiên". Nếu bạn cần nhiều bit hơn, bạn có thể nối các giá trị sum = a + b * (RAND_MAX + 1)
, nhưng điều đó cũng có thể yêu cầu loại dữ liệu lớn hơn int
.
Vì lý do đã nêu của bạn là để tránh kết quả bằng 0: Điều đó không thể tránh được bằng cách thêm kết quả của hai rand()
cuộc gọi, vì cả hai đều có thể bằng không. Thay vào đó, bạn chỉ có thể tăng lên. Nếu RAND_MAX == INT_MAX
, điều này không thể được thực hiện trong int
. Tuy nhiên, (unsigned int)rand() + 1
sẽ làm rất, rất có thể. Có khả năng (không dứt khoát), vì nó yêu cầu UINT_MAX > INT_MAX
, điều này đúng với tất cả các triển khai mà tôi biết (bao gồm khá nhiều kiến trúc nhúng, DSP và tất cả các nền tảng máy tính để bàn, thiết bị di động và máy chủ trong 30 năm qua).
Cảnh báo:
Mặc dù đã được bình luận ở đây, xin lưu ý rằng việc thêm hai giá trị ngẫu nhiên sẽ không có phân phối đồng đều, nhưng phân phối hình tam giác như lăn hai con xúc xắc: để có được 12
(hai con xúc xắc) cả hai con xúc xắc phải hiển thị 6
. vì 11
đã có hai biến thể có thể: 6 + 5
hoặc 5 + 6
, v.v.
Vì vậy, việc bổ sung cũng là xấu từ khía cạnh này.
Cũng lưu ý rằng các kết quả rand()
tạo ra không độc lập với nhau, vì chúng được tạo bởi một trình tạo số giả ngẫu nhiên . Cũng lưu ý rằng tiêu chuẩn không chỉ định phân phối chất lượng hoặc thống nhất của các giá trị được tính toán.
rand()
không thể phủ định ...