簡體   English   中英

如何在R上使用plyr時,將不同的隨機種子用於網狀函數的並行實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM