[英]How to use different random seeds for parallel instances of a reticulate function while using plyr on R
我想的並行化功能,結合plyr
調用通過Python函數reticulate
但似乎是在不同的情況下使用相同的種子。
在python上:
# This is called python_script.py
import random
def give_a_rand():
return(random.random())
在R
library(reticulate)
library(plyr)
library(doMC)
doMC::registerDoMC(cores=10)
reticulate::source_python('/path/to/python_script.py')
加載庫,登記為核心后plyr
並通過Python腳本鏈接到我的R對話reticulate
,我們現在可以調用Python函數give_a_rand()
本身R上
> give_a_rand()
[1] 0.896585
我們可以使用plyr多次運行它而不需要並行化它 :
> aaply(.data=1:10, .margins=1, .fun=function(x){give_a_rand()}, .parallel=F)
1 2 3 4 5 6
0.183420430 0.539790166 0.817348174 0.130959177 0.143210990 0.794048321
7 8 9 10
0.276724929 0.820918953 0.003462523 0.903942433
我想在某些時候我需要強制隨機化引擎的種子,使每個實例都有不同的種子。 到目前為止一切都很棒......但是如何並行化呢?
aaply(.data=1:10, .margins=1, .fun=function(x){give_a_rand()}, .parallel=T)
1 2 3 4 5 6 7 8
0.896585 0.896585 0.896585 0.896585 0.896585 0.896585 0.896585 0.896585
9 10
0.896585 0.896585
好的 - 基於這個答案,我修改了python函數,現在可以正常工作:
import random
def seed_from_urandom():
rand_int = 0
f = open("/dev/urandom","rb")
rnd_str = f.read(4)
for c in rnd_str:
rand_int <<= 8
rand_int += int(c)
return(int(rand_int))
def give_a_rand():
random.seed(seed_from_urandom())
return(random.random())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.