簡體   English   中英

隨機數的生成和random.seed()的使用

[英]Generation of random numbers and the use of random.seed()

我有一個腳本,該腳本應生成一個隨機數,代表傳感器溫度在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='})  

第一次加載模塊時,對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 ==="

因為您在同一秒內重復調用random.seed()。 您需要在腳本開頭將其命名為ONCE,而無需再做一次。 不應將它放置在您多次調用的函數中。

對不起 ,不是真的,請參閱durks的回答。 但是我所說的random.seed()(每個腳本只需調用一次)仍然有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM