Как решить OverflowError при генерации одинаковых случайных чисел между R и Python с использованием SyncRNG - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь воспроизвести коды R в Python, и мне нужно сгенерировать одинаковые случайные числа на обоих языках. Я знаю, что использование одного и того же начального числа недостаточно для получения одинаковых случайных чисел и чтения одного из ответов на этой платформе относительно этой топи c Я обнаружил, что существует: SyncRNG библиотека, которая генерирует те же случайные числа числа между R и Python. Все выглядит хорошо, пока я обнаружил, что на Python 3.7.3 я могу сгенерировать через SyncRNG только одно число, потому что, как только вы выполните итерацию процедуры, например, для l oop, вы получите эту ошибку:

OverflowError: Python int слишком велик для преобразования в C long.

Как я уже говорил:

>>> from SyncRNG import SyncRNG
>>> s = SyncRNG(seed=123)
>>> r = s.rand()
>>> r
0.016173338983207965

и, как мы видим, это работает. Метод ".rand ()" генерирует случайные числа от нуля до единицы. Но если я попытаюсь повторить:

>>> from SyncRNG import SyncRNG
>>> s = SyncRNG(seed=123)
>>> b = []
>>> for i in range(5):
        temp = s.rand()
        b.append(temp)

и получу это:

OverflowError: Python int too large to convert to C long

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<pyshell#41>", line 2, in <module>
    temp = s.rand()
  File "C:\Users\Stefano\AppData\Local\Programs\Python\Python37\lib\site-packages\SyncRNG\__init__.py", line 27, in rand
    return self.randi() * 2.3283064365387e-10
  File "C:\Users\Stefano\AppData\Local\Programs\Python\Python37\lib\site-packages\SyncRNG\__init__.py", line 22, in randi
    tmp = syncrng.rand(self.state)
SystemError: <built-in function rand> returned a result with an error set

Итак, я скромно спрашиваю, может ли кто-нибудь решить эту проблему. Если я потерял старые ответы об этом топи c Извините, пожалуйста, свяжите их в разделе ответов. Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2020

Это не решение, а обходной путь. Ошибка переполнения не воспроизводима в моей системе. Обходной путь:

from SyncRNG import SyncRNG
s = SyncRNG(seed=123)
ct = 0
b = []
while ct < 5:
    try:
        temp = s.rand()
        b.append(temp)
        ct += 1
    except OverflowError:
        pass

Производительность будет снижена из-за попытки / за исключением каждого l oop.

...