我明白set.seed()
會做什麼以及何時可以使用它,但我仍然對函數有很多疑問。這裏有幾個:關於set.seed()的問題R
- 是否有可能「復位」
set.seed()
的東西「更隨機」,如果你剛纔在您的會議稱爲set.seed()
?這甚至是必要的嗎? - 是否可以查看R當前正在使用的種子?
- 有沒有辦法使
set.seed()
允許字母數字種子,你可以在random.org輸入它們的方式(確保你處於高級模式,並查看錶格的「第3部分」以瞭解我的意思)?
我明白set.seed()
會做什麼以及何時可以使用它,但我仍然對函數有很多疑問。這裏有幾個:關於set.seed()的問題R
set.seed()
的東西「更隨機」,如果你剛纔在您的會議稱爲set.seed()
?這甚至是必要的嗎?set.seed()
允許字母數字種子,你可以在random.org輸入它們的方式(確保你處於高級模式,並查看錶格的「第3部分」以瞭解我的意思)?只是爲了好玩:
set.seed.alpha <- function(x) {
require("digest")
hexval <- paste0("0x",digest(x,"crc32"))
intval <- type.convert(hexval) %% .Machine$integer.max
set.seed(intval)
}
所以,你可以這樣做:
set.seed.alpha("hello world")
(其實x
可以是任何R對象,而不僅僅是一個字母數字字符串)
不錯」只是爲了好玩「答案。實際上,我想創建一個在某個函數中使用的種子向量。因此,假設我基於名爲'village.names'的對象創建種子,我可能會做更類似於:'hexval < - paste0(「0x」,sapply(village.names,digest,「crc32」)) ; intval < - type.convert(hexval)%% .Machine $ integer.max'來生成一個種子列表以傳遞給另一個函數。感謝您的所有建議! – A5C1D2H2I1M1N2O1R2T1
如果將種子設置爲類似於時間曆元的最後一位數的種子,但它確實沒有必要。 PRNGs的預期用途是在會話開始時設置一次種子,並使用連續生成的變量。以不同的方式做事,你不會享受R RNG具有的各種優秀的理論和經驗性質。
但我不確定你真的瞭解set.seed的目的。這不是真的有你得到'更隨機'的數字。如果您正在做某種應用程序(R PRNG不足)(例如,如果您需要加密隨機性),則可以通過某種替代方法生成所有隨機數並直接使用它們。 set.seed的真正目的是爲了在使用RNG的結果中產生可重複性。如果使用相同的隨機數生成序列開始相同的分析,並將種子設置爲相同的值,則您將始終得到相同的結果。這對調試很有幫助,而其他人則可以查看您的結果。
要使用劃時代的時間,這樣做
t <- as.numeric(Sys.time())
seed <- 1e8 * (t - floor(t))
set.seed(seed); print(seed)
我明白'set.seed()在可重複性等方面。我看到的是,我說'set.seed(123); a =樣品(300,30); b = sample(300,30)''但我只對使a'「可重現性感興趣」 - 我希望每次都有不同的'b'結果。對我來說,這意味着在運行'a'的行和'b'的行之間,我需要以某種方式重置種子。 – A5C1D2H2I1M1N2O1R2T1
哦,好的。那麼,嘗試像'as.numeric(Sys.time()) - > t; set.seed((t - floor(t))* 1e8 - > seed);打印(種子)'將對大多數目的有效。 – Fhnuzoag
Fhnuzoag應該是一個答案,而不是評論,國際海事組織。 –
對於你的問題3,在TeachingDemos
包中有char2seed
函數,它將採用一個字符串(alhpa numeric)並將其轉換爲一個整數,默認情況下用它來設置一個新的種子。這個想法是,學生可以使用他們的名字(或某些組合/名字子集)作爲種子,這樣每個學生都可以獲得不同的數據集,但是教師可以複製每個學生的數據集。
感謝您的建議。我沒有在我的原始問題中指定它,但我需要根據字符串的向量實際創建一個種子向量。看起來你的功能無法做到這一點;我對麼?順便說一下,很棒的包裝。 – A5C1D2H2I1M1N2O1R2T1
當前版本將只生成1個種子,而不是一個矢量(通過上述目的設計),有一個硬編碼的[[1]]。但是可以修改它(使用sapply而不是抓取strsplit的結果的第一個元素)來處理向量,或者簡單使用'sapply','mapply'或'Vectorize'可以與'char2seed一起使用'從矢量輸入中獲得矢量結果。 –
對於2的答案,首先請參閱幫助頁?RNGkind
。
要找到那種RNG的使用:
RNGkind()
# [1] "Mersenne-Twister" "Inversion"
的梅森難題是默認的。
從幫助頁面:
「 「梅森捻線機」:」從松本和西村(1998年)。A 扭曲的GFSR期間2^19937 - 1和 連續維度(在整個期間)的等分。 「種子」是該組中的32位整數的624維集合加上 當前位置。
要找到正在使用的當前種子,您需要先調用隨機數生成器。
runif(1, 0, 1)
# [1] 0.9834062
.Random.seed
# [Gives a 626 length vector]
中調用set.seed(some_integer)
其次.Random.seed
, 總是會給出相同的626長度矢量,如果你使用相同的some_integer
。換句話說,626長度的矢量完全由some_integer
確定,當然,因爲人們使用Mersenne Twister。
另外,當然,運行set.seed
到某個固定值會給你跟隨它的隨機數例程調用相同的值。這是它在實踐中的主要用途,以提供可重複性。例如。
set.seed(1)
runif(5, 0, 1)
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
rnorm(1, 0, 1)
# [1] 1.272429
set.seed(1)
runif(5, 0, 1)
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
rnorm(1, 0, 1)
# [1] 1.272429
R中的所有基本數字生成器代碼都在源代碼中的src/main/RNG.c文件中。
這是在C中,但很容易遵循。
我有同樣的問題,因爲在問題1,然後我想我可以通過循環簡單復位種子:
set.seed(123)
x<- rnorm(10,1,1)
set.seed(null)
這樣,在每個循環的種子剛剛刪除的結束。它爲我工作。
感謝您的回答。更常見/正統的方法是'rm(.Random.seed,envir = globalenv())',它在'?.Random.seed'的幫助文件中提到過......我只是在這個問題後才得出的:-) – A5C1D2H2I1M1N2O1R2T1
'set.seed(null)'沒有爲我工作。是否有其他方法來重置種子值或使其無效。 – mockash
1.我不認爲這是必要的; 2.''.Random.seed'(它比這更復雜一點,但也許別人會回答) –
閱讀'?RNG'獲得大部分答案 – Andrie