本文共 1269 字,大约阅读时间需要 4 分钟。
在Python中处理Numpy的随机数时,多线程或多进程环境可能会导致无法准确复现随机序列的问题。以下是解决方案:
为每个进程设置不同的随机种子,确保每次执行时生成的随机数序列完全一致。
import numpy as npfrom multiprocessing import Pool, current_process
def process_worker(n): np.random.seed(current_process().name + str(n)) return np.random.randint(0, 100)
if __name__ == "__main__": with Pool() as p: print(list(p.map(process_worker, range(10))))
在多线程环境下,利用GIL和互斥锁保护随机数序列的访问,避免并发修改导致的混乱。
import numpy as npfrom threading import Lock, current_threadfrom concurrent.futures import ThreadPoolExecutor
random_seed = 0random_lock = Lock()
def process_worker(): global random_seed with random_lock: np.random.seed(current_thread().name + str(random_seed)) random_seed += 1 return np.random.randint(0, 100)
if __name__ == "__main__": with ThreadPoolExecutor() as executor: print(list(executor.map(process_worker, range(10))))
直接调用Numpy的np.random.seed()函数设置种子,适用于无需多进程或多线程共享随机数序列的情况。
import numpy as np
def process_worker(n): np.random.seed(n) return np.random.randint(0, 100)
if __name__ == "__main__": print([process_worker(i) for i in range(10)])
以上方法通过不同的方式确保多进程或多线程环境下可以准确复现随机数序列。current_process().name + str(n)和current_thread().name + str(random_seed)用于生成唯一的随机种子。
转载地址:http://onofk.baihongyu.com/