有没有办法为numpy.random.uniform提供概率?

有没有办法为numpy.random.uniform提供概率?,numpy,random,Numpy,Random,我目前正在使用numpy.random.uniform函数生成特定范围内的随机小数 x = np.random.uniform(-5, 5, (1, 2)) 但是,我想增加一个概率,使某个随机值发生。我知道有np.random.choice函数,但我想生成小数,而不是整数。有没有办法生成随机小数并给出它们的概率?如果我正确理解了你的问题,你仍然希望大多数数字都是均匀分布的,但你想指定一个或几个特定值有n%的几率被选择 您仍然可以使用np.random.choice来完成此操作,但是您可以使用这

我目前正在使用
numpy.random.uniform
函数生成特定范围内的随机小数

x = np.random.uniform(-5, 5, (1, 2))

但是,我想增加一个概率,使某个随机值发生。我知道有
np.random.choice
函数,但我想生成小数,而不是整数。有没有办法生成随机小数并给出它们的概率?

如果我正确理解了你的问题,你仍然希望大多数数字都是均匀分布的,但你想指定一个或几个特定值有n%的几率被选择

您仍然可以使用
np.random.choice
来完成此操作,但是您可以使用这些值来执行其他操作,而不是直接使用这些值

这里是一个例子,假设您希望有一个均匀分布,但出现两个特定值的概率为n%,假设分布为[0.0,1.0],偏差值为0.4435和0.89943,每一个都有45%的概率发生,否则正态分布的数字有10%的概率发生

您可以使用
np.random.choice
、10%uniform 45%0.4435和45%0.89943选择您使用的特定百分比的“分布”:

import numpy as np
from enum import Enum


class DistributionChoice(Enum):
    Uniform = 0
    SpecialNumberA = 1  # 0.4435
    SpecialNumberB = 2  # 0.89943


def biased_uniform_distribution():
    choices = [DistributionChoice.Uniform, DistributionChoice.SpecialNumberA, DistributionChoice.SpecialNumberB]
    x = np.random.choice(choices, 1, p=[0.10, 0.45, 0.45])
    #could use dictionary instead, but for simplicity sake, I'm using if statements.
    if x == DistributionChoice.Uniform:
        return np.random.uniform(0.0, 1.0)
    elif x == DistributionChoice.SpecialNumberA:
        return 0.4435
    elif x == DistributionChoice.SpecialNumberB:
        return 0.89943


def main(iterations):
    for i in range(iterations):
        print(biased_uniform_distribution())


if __name__ == "__main__":
    main(100)

#results
0.4435
0.89943
0.5710925183758643
0.4435
0.4435
0.4435
0.4435
0.89943
0.89943
0.4435
0.89943
0.4435
0.5630141728887013
0.4435
0.89943
0.4435
0.89943
0.4435
0.4435
0.4435
0.89943
0.6302538459279832
0.89943
0.89943
0.4435
0.89943
0.89943
0.89943
0.4435
0.89943
0.89943
0.4435
0.09930005052912882
0.6756077455792501
0.89943
0.4435
0.15741601499964686
0.89943
0.89943
0.4435
0.89943
0.4435
0.4435
0.89943
0.89943
0.89943
0.89943
0.89943
0.89943
0.4435
0.4435
0.4435
0.89943
0.4435
0.89943
0.4435
0.89943
0.4435
0.89943
0.4435
0.89943
0.4435
0.4435
0.4435
0.89943
0.18955612016599943
0.89943
0.89943
0.89943
0.4435
0.4435
0.89943
0.7906889281625666
0.89943
0.89943
0.89943
0.89943
0.4435
0.89943
0.8019438261248141
0.4435
0.4435
0.89943
0.89943
0.4435
0.89943
0.4435
0.4435
0.89943
0.4435
0.89943
0.7575394533526174
0.89943
0.8283037670107836
0.5164249955320006
0.4435
0.5558117404002264
0.89943
0.89943
0.4435
现在的一个问题是,从技术上讲,这些数字也有可能出现在同一个分布中。你可以忽略这一点,在实际的实数系统中,任何特定的数字出现的概率都是1/无穷大。实际上,双精度数没有无限的分辨率,因此如果有足够的时间一个数字会再次出现,但它的概率很小,我们几乎可以忽略它


如果你真的想消除这个极为次要的问题,你需要采取更多的概率。一个用于你想要偏向的每个数字,一个用于偏向的数字之间的每个独占范围(因此不包括该数字).

那么为什么不能用由
np.random.uniform
生成的N个值填充一个数组,并将该数组与概率数组一起传递给
np.random.choice
np.random.choice
允许您指定可能的值,它们不需要是整数。请参阅创建随机分布的最常用方法但是,
scipy.stats.rv_continuous
scipy.stats.rv_discrete
。根据您的具体需要,可能会有些过分。Hey@kdf的可能副本太好了!您介意接受我的答案吗?我发现您对这方面比较陌生,所以我会解释一些东西以防万一。单击上的upvote按钮旁边的复选标记我的答案将给我和你两个分数,并将答案标记为“接受”,因为它解决了你的问题。