如何在用户的帮助下可靠地控制python中所有随机性的来源?

2024-04-29 19:59:43 发布

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

太长了,读不下去了,我想能够让用户提供给我的函数/代码,假设用户想要这个功能,告诉我他/她使用的所有随机的源代码。在

我考虑的具体场景是,我正在接收一个函数(指针/句柄),该函数正在实现一些(几乎)任意的程序f,而不使用线程。程序正在使用它内部的任何伪随机函数,除了种子函数(或可能改变随机状态的函数)。将有一个主程序运行f,它需要能够随意改变f的随机种子。所以基本上我的目标是运行以下伪代码:

seed_all_of_python_reliably(seed=current_seed)
controlled_random_output = f(seed=current_seed) # now f works properly according to my seeding

我有一些办法让它正常工作:

  1. 让编写f的用户也编写seed_all_of_python_reliably,其中一些代码可以确保在f运行之前,它的代码也得到了正确的种子。在
  2. 让用户告诉主代码(不知何故我不知道如何在实践中实现的部分)关于它可能使用的所有随机种子代码(来自numpy、scipy、tensorflow、standard random、scikit等)。类似于在定义f的文件中有tell_about_random_seeding(random.seed, numpy.random.seed, ..., etc),那么主服务器可以直接通过它被告知的种子植入并为它们进行种子植入。在
  3. 与上面的类似,但是将它放在f所在的配置文件中(或者实际上可能有很多f并且它们可能共享相同的随机代码)。然后,主机可以在遍历所有f之前先浏览配置文件
  4. 另一个解决方案是,我想提供一个用于使用随机库的API和一个用于为用户播种内容的API。然而,尽管我不知道如何实现这一点(也就是说,似乎我必须从许多可能的库中“继承”代码,并用我自己的库包装它们,这似乎已经是一个难看的解决方案),但即使我做到了,似乎每次用户想要使用某个库时,他们都必须在运行时告诉master,然后master可以继承并包装它,或者在它运行在github代码中之前,开发人员可以对每个请求进行包装。这似乎是四种解决方案中最难(由于大量继承)和最丑陋的(为其他库提供重复的API似乎不必要地丑陋)。在

基本上我需要帮助实现2和3。编写这段代码的方法是否简单到发送种子函数的函数指针,然后让主程序来完成?我希望没有什么奇怪的事我可以忽略。在

假设{/strong>在一个函数中,{/strong>不调用<1}函数。我在想可以用NOP对它们进行monkey-patch,但是,只有当用户告诉我们它使用的种子功能时,才能这样做。假设用户正在编写f,因为它需要主代码的帮助,因此用户不是拜占庭式的,也不会调用种子设定函数。所以,如果我有这样的假设,我不明白为什么我需要用nop来修补它,如果我们信任用户的话。在

另外,作为帮助用户的补充,如果我决定用方法2或3为他们进行种子植入,那么我们可以通过为他们植入公共库来进一步帮助用户。在


Tags: of函数代码用户程序功能apirandom