2012-12-21 17 views
17

Tôi là một newbie R ở đây.In hạt giống ngẫu nhiên hiện tại để tôi có thể nhập nó với set.seed() sau

Hãy nói tôi có các dòng mã

set.seed(123456) 

sau đó tôi muốn có được giá trị 123456 để tôi có thể in nó ra cho các mục đích tài liệu, và nếu cần phải nhập lại giá trị đôi khi trong tương lai. Vì vậy, làm thế nào để tôi có được hạt giống?

Lưu ý rằng tôi có thể nhận xét dòng mã trên, vì vậy tôi sẽ không thực sự biết hạt giống là gì tại 123456. Vì vậy, tôi cần r để in ra vị trí của hạt giống hiện tại dưới dạng một số nguyên, không dưới dạng danh sách 626 số nguyên.

+2

Nó sẽ không đơn giản hơn để làm 'hạt giống <- 123456; set.seed (seed) 'và sau đó in ra và lưu trữ giá trị của' seed'? – joran

+0

Có, nhưng tôi sẽ bình luận ra dòng mã khi tôi không có một hạt giống cụ thể mà tôi muốn bắt đầu. –

+0

trong sự công bằng, có rất nhiều thông tin trong trang đó ... –

Trả lời

25

Có một cách hiệu quả mối quan hệ một chiều giữa các hạt giống được sử dụng trong set.seed() và thông tin trong .Random.seed; như ?Random.seed nói và @ MattTenenbaum của câu trả lời cho thấy, các thông tin trong .Random.seed có thể được lưu và phục hồi. Tôi đánh giá cao mong muốn cho một chức năng đó sẽ lấy được một hạt giống số nguyên đơn giản từ trạng thái hiện tại của .Random.seed, nhưng trong sự vắng mặt của nó, bạn cần phải lưu và khôi phục thông tin đầy đủ ... ví dụ

set.seed(1001) 
save(".Random.seed",file="random_state_seed1001.RData") ## save current state 
runif(1) 
## [1] 0.9856888 
runif(1) 
## [1] 0.4126285 
runif(1) 
## [1] 0.4295392 
load("random_state_seed1001.RData") ## restore state just after set.seed() 
runif(1) 
## [1] 0.9856888 

Như @JoshuaUlrich chỉ ra, đây chỉ hoạt động/chỉ an toàn nếu bạn không sửa đổi các loại RNG (và loại máy phát điện đi chệch bình thường) giữa tiết kiệm và khôi phục ...

Một giải pháp hoàn chỉnh hơn:

save_rng <- function(savefile=tempfile()) { 
    if (exists(".Random.seed")) { 
     oldseed <- get(".Random.seed", .GlobalEnv) 
    } else stop("don't know how to save before set.seed() or r*** call") 
    oldRNGkind <- RNGkind() 
    save("oldseed","oldRNGkind",file=savefile) 
    invisible(savefile) 
} 

restore_rng <- function(savefile) { 
    load(savefile) 
    do.call("RNGkind",as.list(oldRNGkind)) ## must be first! 
    assign(".Random.seed", oldseed, .GlobalEnv) 
} 

Hãy dùng thử:

set.seed(101) 
RNGstore <- save_rng() ## save file name 
runif(1) 
## [1] 0.3721984 
runif(10) 
## [1] 0.04382482 0.70968402 0.65769040 0.24985572 0.30005483 0.58486663 
## [7] 0.33346714 0.62201196 0.54582855 0.87979573 
restore_rng(RNGstore) 
runif(1) 
## [1] 0.3721984 

Xem thêm: http://www.cookbook-r.com/Numbers/Saving_the_state_of_the_random_number_generator/

+1

Đây không phải là giải pháp an toàn thực sự mà không đảm bảo loại RNG và loại thông thường hiện được đặt thành các giá trị ngụ ý bởi '.Random.seed'. –

+0

@JoshuaUlrich, bạn có biết nếu có một ví dụ làm việc nằm xung quanh có một nơi nào đó để tiết kiệm và khôi phục trạng thái RNG hoàn chỉnh (nó không có trong 'ví dụ (". Random.seed ")' theo như tôi có thể nói)?Nếu không, tôi có thể gặp rắc rối khi chỉnh sửa câu hỏi của tôi, nếu không tôi sẽ chỉ liên kết với nó ... –

+0

Tôi không biết ví dụ nào như vậy; Tôi nghi ngờ có một vì đó là những gì 'set.seed' là cho. –

3

Khi bạn đã gọi số set.seed, bạn sẽ có thể tham chiếu .Random.seed (xem http://stat.ethz.ch/R-manual/R-patched/library/base/html/Random.html để biết thêm thông tin).

Một ví dụ đơn giản:

set.seed(123) 
tmp <- .Random.seed 
> runif(10) 
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147 
.Random.seed <- tmp 
> runif(10) 
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147 
+2

Nhưng .Random.seed cho tôi một danh sách 626 số nguyên. –

3

Đây là cái gì đó nên chỉ làm việc tốt trong thực tế (nhưng không nên được sử dụng cho ví dụ mật mã):

new.seed <- as.integer(runif(1)*2e9) 
cat("Random seed: ", new.seed, "\n") 
set.seed(new.seed) 

Bạn cần phải thực sự thiết lập các hạt giống để làm việc này, vì vậy nó không hoàn toàn là một câu trả lời cho câu hỏi ban đầu, nhưng có thể là những gì bạn đang tìm kiếm, vì nó cho phép bạn có một cách dễ dàng hạt giống ngẫu nhiên được chỉ định mà không đặt nó theo cách thủ công với số nguyên được xác định trước.