【问题标题】:Generate List of random Floats in a sequence for Mocking IoT Sensor按顺序生成随机浮点列表以模拟物联网传感器
【发布时间】:2021-11-04 10:18:23
【问题描述】:

我一直在努力模拟 IoT 传感器数据。我需要一个浮动列表,它将按顺序增加和减少。 例如 [0.1, 0.12, 0.13, 0.18, 1.0, 1.2, 1.0, 0.9, 0.6] 现在我已经使用这个生成了最大和最小范围的列表,

for k in dts:
    x = round(random.uniform(j["min"], j["max"]), 3)
    random_float_list.append(x)

从这个代码生成的列表不是一个序列。我需要一些能在范围内产生随机浮点数并且没有突然变化的东西。值可以按顺序增加和减少。

【问题讨论】:

    标签: python random iot


    【解决方案1】:

    您可以生成多个随机序列并将它们粘合在一起。像这样的:

    import numpy as np
    
    
    def gen_floats(count, min_step_size, max_step_size, max_seq_len):
        # Start around 0
        res = [np.round(np.random.rand() - 0.5, 2)]
        while len(res) < count:
            step_size = np.random.uniform(min_step_size, max_step_size)
            # Generate random number of steps for sequence
            remaining = count - len(res)
            steps = np.random.randint(1, remaining + 1 if remaining < max_seq_len else max_seq_len)
            # Generate additive or subtractive sequence using previous values
            if np.random.rand() > 0.5:
                vals = np.round(np.linspace(res[-1] + step_size, res[-1] + steps * step_size, steps), 2)
            else:
                vals = np.round(np.linspace(res[-1] + step_size, res[-1] - steps * step_size, steps), 2)
            res.extend(vals)
        return res
    

    然后print(gen_floats(20, 0.1, 0.5, 10)) 生成类似:[0.4, 0.86, 0.25, -0.37, -0.99, -1.61, -2.23, -2.85, -2.64, -2.95, -3.26, -3.57, -3.88, -3.63, -3.38, -3.19, -2.89, -2.63, -3.15, -3.68]。您可以使用参数来匹配所需的输出。

    【讨论】:

    • 如果我们想给出一个最小最大范围怎么办?
    • 您可以使用np.clip 限制值?
    【解决方案2】:

    如果您想要一个可以控制值之间的最小、最大和最大差异的随机数,这样的方法应该可以工作。

    它将首先在startend 之间随机一个值,并将其附加到列表output。下一个值将是output 列表+-max_diff 中最后一个值之间的随机值。

    import random
    def rand(start,end,max_diff,elements,output):
        elements -= 1
        if output:
            if output[-1]-max_diff < start: #To not get a value smaller than start
                output.append(round(random.uniform(start,output[-1]+max_diff),3))
            elif output[-1]+max_diff > end: #To not get a value bigger than end
                output.append(round(random.uniform(output[-1]-max_diff,end),3))
            else:
                output.append(round(random.uniform(output[-1]-max_diff,output[-1]+max_diff),3))
        else:
            output.append(round(random.uniform(start,end),3))
        if elements > 0:
            output = rand(start,end,max_diff,elements,output)
        return output
    
    print(rand(1,2,0.1,3,[])) #[1.381, 1.375, 1.373]
    

    【讨论】:

      【解决方案3】:

      您可以生成均匀分布的随机数,然后将数字在第一部分按升序排序,在第二部分按降序排序。

      import numpy as np
      np.random.seed(0)
      
      
      def gen_rnd_sensor_data(low: float,
                              high: float,
                              n_incr: int,
                              n_decr: int) -> np.ndarray:
          incr = np.random.uniform(low=low, high=high, size=n_incr)
          incr.sort()
          decr = np.random.uniform(low=low, high=high, size=n_decr)
          decr[::-1].sort()
          return np.concatenate((incr, decr))
      

      然后你可以调用这个函数:

      print(gen_rnd_sensor_data(0, 1, 5, 3))
      

      这会生成 0. 和 1. 之间的数据,前 5 个值在增加,后 3 个值在减少。在程序内部,每次调用函数,都会得到不同的结果,但是如果重新运行程序,得到的结果是一样的,所以你可以调试你的程序。

      【讨论】:

      • 如果希望差异均匀分布(而不是值本身),则使用均匀分布生成n_incr个随机数,然后计算累积和即可也解决这种类型的功能请求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多