【问题标题】:Generation of random numbers and the use of random.seed()随机数的生成和 random.seed() 的使用
【发布时间】:2015-10-25 13:04:22
【问题描述】:

我有一个脚本,它应该生成一个随机数,它表示传感器温度在 25 到 28°C 之间(含),并在正文中执行带有一些 xml 的 POST 请求。代码结构如下:

def randomTemperature():
    random.seed()
    return str(random.randint(25,28))

create_DATA_contentInstance_xml_body = '''<obj>
                                         <str name="appId" val="''' +        new_senzor_name + '''"/>
                                         <str name="category" val="temperature "/>
                                         <int name="data" val="''' + randomTemperature() + '''"/>
                                         <int name="unit" val="celsius"/>
                                    </obj>'''

create_DATA_contentInstance = urllib2.Request(url=create_DATA_contentInstance_url , 
                                  data=create_DATA_contentInstance_xml_body, 
                                  headers={'Authorization': 'Basic abcaW46YabcaW4='})   

def createDATAcontentInstance():
    urllib2.urlopen(create_DATA_contentInstance)                
    print "\n=== Created a DATA contentInstance ==="

def createSensorAndDataInstances():
    while True:
        #generate a random delay
        randomDelay = random.randint(1,5)
        time.sleep(randomDelay)
        createDATAcontentInstance()

createSensorAndDataInstances()

如果我运行createSensorAndDataInstances(),则始终返回并发布相同的模拟温度。

我目前的理解是random.seed() 方法使用系统的当前时间作为方法的参数,因此该方法应该返回一个随机数,如果我运行以下代码,它会返回一个随机数,这是我的剥离版本脚本代码:

import random
import time

def randomTemperature():
    random.seed()
    return str(random.randint(25,28))

def createSensorAndDataInstances():
    while True:
        #generate a random delay
        randomDelay = random.randint(1,5)
        time.sleep(randomDelay)
        print randomTemperature()

createSensorAndDataInstances()

有人知道为什么它在第一种情况下总是返回相同的数字吗?

EDIT1:尝试了@dursk 的建议,但它仍然不起作用。我做了以下更改:

create_DATA_contentInstance_xml_body = '''<obj>
                                      <str name="appId" val="''' + new_senzor_name + '''"/>
                                      <str name="category" val="temperature "/>
                                      <int name="data" val="{}"/>
                                      <int name="unit" val="celsius"/>
                                    </obj>
                                    '''

create_DATA_contentInstance = urllib2.Request(url=create_DATA_contentInstance_url , 
                                  data=create_DATA_contentInstance_xml_body.format(randomTemperature()), 
                                  headers={'Authorization': 'Basic YWRtaW46YWRtaW4='})  

【问题讨论】:

    标签: python random http-post


    【解决方案1】:

    在第一次加载模块时,对 xml 字符串中的randomTemperature() 的调用执行一次。您需要对字符串进行参数化,并调用该方法,每次都传递一个新值。

    create_DATA_contentInstance_xml_body = '''
    <obj>
      <str name="appId" val="{}"/>
      <str name="category" val="temperature "/>
      <int name="data" val="{}"/>
      <int name="unit" val="celsius"/>
    </obj>
    '''
    
    def createDATAcontentInstance():
        urllib2.urlopen(create_DATA_contentInstance.format(
            new_senzor_name,
            randomTemperature()
        )                
        print "\n=== Created a DATA contentInstance ==="
    

    【讨论】:

      【解决方案2】:

      因为您在同一秒内重复调用 random.seed()。 您需要在脚本的开头调用它一次,并且永远不要再调用它。不应将其放置在您多次调用的函数中。

      抱歉,不是真的,请参阅 durks 的回答。但是我所说的每个脚本只需要调用一次的 random.seed() 仍然有效。

      【讨论】:

      • 但是如果每个生成的温度值之间有 1 到 5 秒的延迟,它是如何在同一秒内调用的呢?
      • 即使在同一秒内调用它,它仍然会生成一个随机数,因为random.seed() 使用os.urandom 作为其熵源。
      猜你喜欢
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多