2015-10-25 89 views
0

我有一個腳本,它應該生成一個隨機數,它代表25到28°C之間的傳感器溫度,並執行一個POST請求,其中包含一些xml身體。該代碼的結構是這樣的:隨機數的產生和使用random.seed()

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='}) 

回答

0

在XML字符串excutes 一次,當第一次加載模塊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 ===" 
-1

因爲你在同一秒鐘內反覆調用random.seed()。 您需要在腳本的開頭將其稱爲ONCE,並且不要再次執行此操作。它不應該被放置在你多次調用的函數中。

對不起,不是真的,請參閱durks的答案。但是我對random.seed()所說的每個腳本只需要調用一次即可。

+0

但是,如果在每個生成的溫度值之間存在1到5秒的延遲,它在同一秒內是如何調用的? – TheAptKid

+0

如果它在同一秒內被調用過,它仍然會產生一個隨機數,因爲'random.seed()'使用'os.urandom'作爲它的熵源。 – ppperry