Tại sao runif không tạo ra kết quả giống nhau mỗi lần?


11

Tại sao các trình tạo số ngẫu nhiên như runif()trong R không tạo ra kết quả giống nhau mỗi lần?

Ví dụ:

X <- runif(100)
X

đang tạo ra các đầu ra khác nhau mỗi lần.

Lý do để tạo ra đầu ra khác nhau mỗi lần là gì?

Những chức năng nào nó đã diễn ra trong nền để làm điều này?


3
Một cách để nghĩ về điều này là tự hỏi: "bạn có muốn trình tạo số ngẫu nhiên của mình tạo ra các số giống nhau mỗi lần không?"
Shadowtalker

2
@ssdecontrol: Xem Dilbert
Henry

2
Hoặc xkcd
Henry

Câu trả lời:


18

Thực chất đây không chỉ là câu hỏi R; nó liên quan đến việc tạo số ngẫu nhiên nói chung hơn.

Số "ngẫu nhiên" rất quan trọng trong nhiều phần của thống kê. Chúng ta cần các giá trị ngẫu nhiên mà chúng ta tạo ra để có các thuộc tính nhất định và (thường) rất nhiều nỗ lực để xây dựng các trình tạo số ngẫu nhiên và kiểm tra các thuộc tính của chúng.

Ý tưởng là chúng tôi muốn có được một chuỗi các giá trị là một proxy tốt cho các số thực sự ngẫu nhiên. Cách làm việc thông thường của việc tạo số ngẫu nhiên là phân phối đồng đều (từ đó chúng ta xây dựng các số khác, như các số ngẫu nhiên Gaussian).

[0,1)

Ví dụ, nhiều người chỉ làm việc trên cái trước:

x1=f(x0)z1=x1/mx2=f(x1)z2=x2/mx3=f(x2)z3=x3/m

xzf

x0

x3

Xem ?runiftrong R và bạn sẽ lưu ý rằng nó giải thích về sự tồn tại của hạt giống ngẫu nhiên, với một liên kết đến trợ giúp ?.Random.seedgiải thích số lượng lớn các trình tạo số ngẫu nhiên có sẵn trong R (thậm chí bạn có thể tự cung cấp). Trang trợ giúp tương tự giải thích rằng nếu bạn chưa sử dụng tạo số ngẫu nhiên trước hoặc đặt hạt giống, để bắt đầu với hạt giống được lấy từ đồng hồ và sau đó giá trị trước đó được lưu trữ (để số ngẫu nhiên tiếp theo bạn nhận được sẽ là cùng một thứ bạn đã nhận được nếu bạn tạo thêm một giá trị lần trước - nó ghi nhớ "nơi bạn đang đến").

Hàm runiftrong R (giống như một vài thói quen tạo số ngẫu nhiên khác trong các gói khác thường có thể làm điều gì đó tương tự) biết về nơi lưu giữ hạt giống số ngẫu nhiên. Nó tiếp tục cập nhật giá trị đó khi nó đi. Vì vậy, nó có thể hoạt động mà không cần phải thông qua một hạt giống, nhưng nó vẫn sử dụng một hạt giống; nếu bạn không cho nó một cái, nó chỉ sử dụng cái mà nó đã lưu cuối cùng.

Về lý do tại sao nó cung cấp các đầu ra khác nhau mỗi lần (nếu bạn không bảo nó đưa ra cùng một chuỗi): nó thực hiện điều này bởi vì các giá trị giống nhau mỗi lần thường sẽ rất phản tác dụng - nó sẽ không có các thuộc tính lặp đi lặp lại lấy mẫu ngẫu nhiên sẽ có, làm cho nó không hữu ích cho các giả định mà chúng tôi sử dụng các trình tạo số ngẫu nhiên cho.


14

Bạn phải đặt hạt giống ngẫu nhiên để có được kết quả tương tự mỗi lần. Sử dụng ? Set.seed để làm như vậy. Xem xét:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

Bạn có thể quan tâm đến việc đọc này: Lý do sử dụng hàm set.seed .


3
Mặc dù điều này giải thích các cơ chế tái tạo một tập hợp kết quả, nhưng dường như nó không giải quyết được câu hỏi, điều này tự hỏi tại sao loại hành vi này không tự động.
whuber

@whuber, tôi nghĩ rằng câu hỏi không phải là chủ đề từ xa ở đây. Tôi đã bỏ phiếu để đóng ngay lập tức và sẽ đóng hoàn toàn nếu tôi có đặc quyền đó. Tôi đã đăng bài này để OP sẽ không trắng tay.
gung - Tái lập Monica

chạy "set.seed (1)" mọi lúc.
Nip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.