如何在使用plyr时,为并行实例的reticulate函数使用不同的随机种子

2024-10-03 17:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图结合plyr的并行化特性,通过reticulate调用python函数,但在不同的实例上似乎使用了相同的种子

在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注册内核并通过reticulate将python脚本链接到我的R会话之后,我们现在可以在R上本地调用python函数give_a_rand()

> 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

Tags: 实例函数pydatalibraryscriptrandom种子
1条回答
网友
1楼 · 发布于 2024-10-03 17:20:28

好的-基于this答案,我修改了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())

相关问题 更多 >