首页 > 解决方案 > 在python中使用动态平均值从概率分布中绘制随机浮点数

问题描述

我正在寻找一种从概率分布中绘制随机浮点数的方法,该概率分布的均值或位置具有模型中节点的值。最重要的是,绘制的数字不应超过 [-1.0, 1.0] 的范围,并且不应超过 1 个小数。

有点像这样

因此,如果节点的值是 0.8,则 loc 应该是 0.8,但不能绘制 1 之外的值。我对编程真的很陌生,所以如果有人能给我任何关于这是否可以开始的提示,我将不胜感激。使用 normal([loc, scale, size] 我认为这是不可能的。在此先感谢


非常感谢您的回答。我的错,我的意思是小数点后两位!这使得解决方案与您的建议不同,我猜是因为数字的数量增加了很多,也许这种方法不可行?

现在我有这个:

def randomnumber(loc, scale): return np.random.normal(loc, scale, size=None)

                elif node == 'is_po': 
                      for neig in graph.predecessors(node):
                        neig_w = graph.edges[neig, node]['weight']
                        neig_s = graph.node[neig]['status'][t - delta_t]

                        loc = neig_s
                        scale = 1

                        c = randomnumber(loc, scale)
                        graph.node[node]['status'][t] = c * delta_t

这似乎给了我一个围绕 neig_s 值绘制的随机数,但我不知道是否有可能确保绘制的随机数不来自高于 1 或低于 -1。

标签: pythonrandomprobabilitydistribution

解决方案


我假设您想要一个比例为 1 的正态分布数字。一个简单的解决方案如下:

import numpy as np
def func(loc):
    max_iter = 1000
    x = np.random.normal(loc)
    c = 0
    while c < max_iter:
        if x > -1 and x < 1:
            return x
        c += 1
        x = np.random.normal(loc)
    print('max iter exceeded')

请注意,如果您为 loc 参数指定高值或低值,则 while 循环将永远运行,因此我设置了一个限制“max_iter”。

如果你想要一个更高级的解决方案,那么你已经定义了一个截断的正态分布(你可以在 scipy 中做到这一点)。


推荐阅读