Nhiều câu trả lời hay, nhưng cho phép tôi thêm một câu trả lời khác và nhấn mạnh rằng trong một máy tính xác định, không có gì là ngẫu nhiên. Điều này đúng cho cả các số được tạo bởi một RNG giả và các số dường như "ngẫu nhiên" được tìm thấy trong các vùng của bộ nhớ dành cho các biến cục bộ C / C ++ trên ngăn xếp.
NHƯNG ... có một sự khác biệt quan trọng.
Các số được tạo bởi một trình tạo giả ngẫu nhiên tốt có các thuộc tính làm cho chúng giống nhau về mặt thống kê với các lần rút ngẫu nhiên thực sự. Ví dụ, phân phối là thống nhất. Độ dài chu kỳ dài: bạn có thể nhận được hàng triệu số ngẫu nhiên trước khi chu kỳ lặp lại. Chuỗi không được tự động tương quan: ví dụ, bạn sẽ không bắt đầu thấy các mẫu lạ xuất hiện nếu bạn lấy mỗi số thứ 2, 3 hoặc 27 hoặc nếu bạn nhìn vào các chữ số cụ thể trong các số được tạo.
Ngược lại, các số "ngẫu nhiên" bị bỏ lại trên ngăn xếp không có thuộc tính nào trong số này. Giá trị của chúng và tính ngẫu nhiên rõ ràng của chúng phụ thuộc hoàn toàn vào cách chương trình được xây dựng, cách nó được biên dịch và cách nó được tối ưu hóa bởi trình biên dịch. Ví dụ, đây là một biến thể của ý tưởng của bạn dưới dạng một chương trình độc lập:
#include <stdio.h>
notrandom()
{
int r, g, b;
printf("R=%d, G=%d, B=%d", r&255, g&255, b&255);
}
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 10; i++)
{
notrandom();
printf("\n");
}
return 0;
}
Khi tôi biên dịch mã này với GCC trên máy Linux và chạy nó, hóa ra nó có tính quyết định khá khó chịu:
R=0, G=19, B=0
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
R=130, G=16, B=255
Nếu bạn đã xem mã được biên dịch bằng trình dịch ngược, bạn có thể xây dựng lại những gì đang diễn ra, một cách chi tiết. Cuộc gọi đầu tiên đến notrandom () đã sử dụng một vùng của ngăn xếp mà chương trình này không sử dụng trước đó; Ai biết cái gì ở đó. Nhưng sau cuộc gọi đó đến notrandom (), có một lệnh gọi printf () (mà trình biên dịch GCC thực sự tối ưu hóa cho một lệnh gọi tới putchar (), nhưng đừng bận tâm) và ghi đè lên ngăn xếp. Vì vậy, lần tiếp theo và lần tiếp theo, khi notrandom () được gọi, ngăn xếp sẽ chứa dữ liệu cũ từ việc thực hiện putchar () và vì putchar () luôn được gọi với cùng các đối số, dữ liệu cũ này sẽ luôn giống nhau, quá.
Vì vậy, hoàn toàn không có gì ngẫu nhiên về hành vi này, cũng như các con số thu được theo cách này có bất kỳ tính chất mong muốn nào của trình tạo số giả ngẫu nhiên được viết tốt. Trong thực tế, trong hầu hết các kịch bản thực tế, giá trị của chúng sẽ lặp đi lặp lại và có mối tương quan cao.
Thật vậy, như những người khác, tôi cũng sẽ nghiêm túc xem xét việc sa thải ai đó đã cố gắng loại bỏ ý tưởng này như là một "RNG hiệu suất cao".