如何在python中使用随机形成函数的恒定结果

时间:2018-12-17 08:07:43

标签: python random

让我们看一下打击示例

import numpy as np

def Test2(t):                     
    ran=np.random.randint(5)
    return t-ran

def Test3(t):                     
    test2=Test2(t)
    return t**2-test2

a1=Test3(1.0)                    
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)  

答案是错误的,因为每次我调用Test3()时,它都会经过Test2()中的随机部分,并给我不同的结果。因此,我该如何使用相同的Test3()进行进一步的计算,这意味着我只想通过一次Test2()并获得一个常数Test3()。
因为我需要Test3()来进行更多计算,例如查找根,所以这意味着我需要在以后多次调用Test3()。

3 个答案:

答案 0 :(得分:2)

Sam Hollenbach的解决方案很好,但考虑到您非常孤立的问题,它的解决方案相当复杂。 我建议将随机值作为参数传递给Test3。

import numpy as np

def Test2(t):                     
    ran=np.random.randint(5)
    return t-ran

def Test3(t, ran):
    return t**2-ran

ran = Test2(1.0)
a1=Test3(1.0, ran)                    
a2=Test3(1.0, ran)
a3=Test3(1.0, ran)
print(a1==a2,a1==a3,a2==a3) 

这将隔离随机性,并且比为它提供一个类更接近您提供的代码。

答案 1 :(得分:1)

有很多方法可以做到这一点。以下所有方法将显示(True, True, True)

有课

import numpy as np

class TestClass:

    def __init__(self):
        self.test2out = None

    def Test2(self, t):                     
        ran=np.random.randint(5)
        return t-ran

    def Test3(self, t):
        if self.test2out is None:
            self.test2out = self.Test2(t)
        return t**2-self.test2out


testClass = TestClass()

a1=testClass.Test3(1.0)                    
a2=testClass.Test3(1.0)
a3=testClass.Test3(1.0)

print(a1==a2,a1==a3,a2==a3)

具有记忆力

import numpy as np

def memoize(function):
    """Provides a decorator for memoizing functions"""
    from functools import wraps
    memo = {}
    @wraps(function)
    def wrapper(*args):
        if args in memo:
            return memo[args]
        else:
            rv = function(*args)
            memo[args] = rv
            return rv
    return wrapper

@memoize
def Test2(t):                     
    ran=np.random.randint(5)
    return t-ran

def Test3(t):
    test2 = Test2(t)
    return t**2-test2


a1=Test3(1.0)                    
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)

来源:Wikipedia


具有全局变量

import numpy as np

test2outcome = None

def Test2(t):                     
    ran=np.random.randint(5)
    return t-ran

def Test3(t): 
    global test2outcome   
    if test2outcome is None:
        test2outcome = Test2(t)
    return t**2-test2outcome

a1=Test3(1.0)                    
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)

答案 2 :(得分:1)

您可以在Test3中植入随机生成器。这样可以确保Test3是可预测的,同时保持Test2的伪随机性:

import numpy as np

def Test2(t):                     
    ran=np.random.randint(5)
    return t-ran

def Test3(t):
    np.random.seed(0)                    
    test2=Test2(t)
    return t**2-test2

a1=Test3(1.0)                    
a2=Test3(1.0)
a3=Test3(1.0)
print(a1==a2,a1==a3,a2==a3)