Как использовать разные случайные начальные числа для параллельных экземпляров сетчатой ​​функции при использовании plyr на R - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь объединить функцию распараллеливания 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

1 Ответ

0 голосов
/ 31 мая 2019

ОК - на основе этого ответа. Я изменил функцию 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())
...