Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 带尖峰的随机数发生器_Python 3.x - Fatal编程技术网

Python 3.x 带尖峰的随机数发生器

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

我正在用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 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