【问题标题】:How do I make a random number shared between instances?如何在实例之间共享一个随机数?
【发布时间】:2020-06-21 13:16:17
【问题描述】:
import random

class Unique_Key(object):
def __init__(self):
    self.uni_k =random.randint(1, 1000000)
    


unique_key_obj1=Unique_Key()
print(f"First Record {unique_key_obj1.uni_k}")


unique_key_obj=Unique_Key()
print(f"Second Record {unique_key_obj.uni_k}")

有人可以帮助我如何使unique_key_obj1 对象的值与unique_key_obj 对象的值相同吗?谢谢!

【问题讨论】:

    标签: python function random


    【解决方案1】:

    您应该将此变量设置为类变量,而不是实例变量。像这样:

    import random
    
    class Unique_Key(object):
        uni_k = random.randint(1, 1000000)
        
        def __init__(self):
            pass
    
    unique_key_obj1 = Unique_Key()
    print(f"First Record {unique_key_obj1.uni_k}")
    
    unique_key_obj = Unique_Key()
    print(f"Second Record {unique_key_obj.uni_k}")
    
    First Record 208217
    Second Record 208217
    

    当您将self.some_variable 设置为随机值时,它将创建一个仅特定于该实例的变量,而不是在对象的所有实例之间共享。

    类变量通常定义在所有方法之外,位于类头的正下方,构造方法和其他方法之前。

    【讨论】:

    • 非常感谢 Nicolas Gervais。它就像我想要的那样工作,也感谢额外的学费!
    【解决方案2】:

    使用播种随机生成器。

    import random
    
    class Unique_Key(object):
    def __init__(self):
        self.uni_k =random.randint(1, 1000000)
        
    mySeed = random.randint(1, 1000000)
    random.seed(mySeed)
    unique_key_obj1=Unique_Key()
    print(f"First Record {unique_key_obj1.uni_k}")
    
    
    random.seed(mySeed)
    unique_key_obj=Unique_Key()
    print(f"Second Record {unique_key_obj.uni_k}")
    

    【讨论】:

    • 非常感谢,鲁佩什。它确实有效,但我不希望这两个值保持不变,我仍然希望它们具有随机特征但值相同。
    • 我已经相应地编辑了我的答案。你可以让 Seed 成为一个新的随机数@agbesi-innocent
    【解决方案3】:

    您可以在不设置seed 的情况下进行操作。我们可以通过保存先前的随机状态并将其分配给下一个随机调用来做到这一点。这将确保生成相同的数字。

    这取自 python 文档。

    random.getstate()

    返回一个捕获当前内部状态的对象 发电机。可以将此对象传递给 setstate() 以恢复 状态。

    在 python 文档random中阅读有关随机模块的更多信息

    import random
    prev_state = random.getstate()
    num1 = random.randint(1, 1000000)
    
    random.setstate(prev_state)
    num2 = random.randint(1, 1000000)
    
    print num1==num2
    

    输出

    True
    

    现在,在您的情况下,您可以将状态保存在类对象中而不是实例中,见下文。所以在每个新的类实例中,你都会得到相同的随机数。

    class Unique_Key(object):
        intial_random_state = prev_state = random.getstate()
    
        def __init__(self):
            random.setstate(Unique_Key.intial_random_state)
            self.uni_k =random.randint(1, 1000000)
    
    x = Unique_Key()
    y = Unique_Key()
    

    输出

    print x.uni_k == y.uni_k
    True
    

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多