Python 3.x 带尖峰的随机数发生器
我正在用python生成一些数据,如下所示:Python 3.x 带尖峰的随机数发生器,python-3.x,Python 3.x,我正在用python生成一些数据,如下所示: import random import time def generate_random_data(): pressure = float(random.randint(2409,2415) / 100) temp = float(random.randint(6989,7045) / 100) data = {"pressure": pressure, "temperature": temp} return da
import random
import time
def generate_random_data():
pressure = float(random.randint(2409,2415) / 100)
temp = float(random.randint(6989,7045) / 100)
data = {"pressure": pressure, "temperature": temp}
return data
if __name__ == '__main__':
while True:
rslt = generate_random_data()
print(rslt)
time.sleep(60)
但我还想做的是每隔一段时间生成一个超出范围的尖峰……在生成一个范围内的数字时,我怎么能这样做呢?对您的代码进行一点更新:
import random
import time
def generate_random_data():
peak_chance = random.randint(0, 100)
is_peak = False
if peak_chance < 10: # 10% chance for under-value
pressure = float(random.randint(2309, 2409) / 100)
temp = float(random.randint(6889, 6989) / 100)
is_peak = True
elif peak_chance > 90: # 10% chance for peak-value
pressure = float(random.randint(2415, 2515) / 100)
temp = float(random.randint(7045, 7145) / 100)
is_peak = True
else:
pressure = float(random.randint(2409, 2415) / 100)
temp = float(random.randint(6989, 7045) / 100)
data = {"pressure": pressure, "temperature": temp, "peak": is_peak}
return data
if __name__ == '__main__':
while True:
rslt = generate_random_data()
print(rslt)
time.sleep(1)
如果使用>=Python3.6(),则可以利用
random.choices
方法及其weights
参数:
这将打印:
number of temp >= 24: 10000
number of temp >= 25: 1033
number of temp >= 35: 207
number of pressure >= 69: 10000
number of pressure >= 71: 1033
number of pressure >= 81: 207
这会浪费大量时间重新计算不需要在每次迭代中重新计算的内容。每次迭代都会重新计算
列表(ranges.values())
,此外,随机选择每次都需要将权重
转换为累积权重。预先计算list(ranges.values())
和cum_weights
将节省时间。此外,float
调用是不必要的,您的打印中混入了temp
和pressure
,而len(list(genexp))
是笨拙和低效的-您可以用len代替它(listcomp)
或sum(1表示生成的\u数据中的i如果条件)
,其中条件
是原始列表理解中的条件(或sum(表示生成的\u数据中的i的条件)
,使用Python中bool是int的事实)。
import random
import time
ranges = {
0.9: {'pressure': (2409, 2415), 'temp': (6989,7045)}, # 90% will be in normal range
0.08: {'pressure': (2500, 3000), 'temp': (7100, 7500)}, # 8% will be a peak
0.02: {'pressure': (3500, 4000), 'temp': (8100, 9500)}, # 2% will be a extreme peak
}
def generate_random_data(ranges):
while True:
r = random.choices(list(ranges.values()), weights=ranges.keys())[0]
pressure = float(random.randint(*r['pressure']) / 100)
temp = float(random.randint(*r['temp']) / 100)
yield pressure, temp
if __name__ == '__main__':
n = 10000
generated_data = [v for i, v in zip(range(n), generate_random_data(ranges))]
print('number of temp >= 24:', len(list(i[0] for i in generated_data if i[0] >= 24)))
print('number of temp >= 25:', len(list(i[0] for i in generated_data if i[0] >= 25)))
print('number of temp >= 35:', len(list(i[0] for i in generated_data if i[0] >= 35)))
print('number of pressure >= 69:', len(list(i[1] for i in generated_data if i[1] >= 69)))
print('number of pressure >= 71:', len(list(i[1] for i in generated_data if i[1] >= 71)))
print('number of pressure >= 81:', len(list(i[1] for i in generated_data if i[1] >= 81)))
number of temp >= 24: 10000
number of temp >= 25: 1033
number of temp >= 35: 207
number of pressure >= 69: 10000
number of pressure >= 71: 1033
number of pressure >= 81: 207