我目前正在使用numpy.random.uniform
函数来生成特定范围内的随机小数。
x = np.random.uniform(-5, 5, (1, 2))
但是,我想增加某个随机值出现的概率。我知道np.random.choice
函数具有它,但是我想生成小数而不是整数。有没有一种方法可以生成随机的小数并给出概率呢?
答案 0 :(得分:0)
如果我正确理解了您的问题,您仍然希望大多数数字的分布均匀,但是您想要指定单或一些特定值的百分比有机会被选中?
您仍然可以使用np.random.choice
来完成此操作,但是您可以直接使用这些值来执行其他操作,而不是直接使用这些值。
这里是一个示例,假设您希望有一个均匀的分布,但是出现两个特定值的概率为n%,假设分布为[0.0,1.0),偏差值为0.4435和0.89943,每个偏差值为45 %发生的机会,否则以正态分布的数字有10%发生的机会。
您可以做的是使用np.random.choice
选择一定百分比使用的“分布”,使用10%均匀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
现在,与此相关的一个问题是,从技术上讲,这些数字也有可能在同一分布中显示。您可能会忽略这一点,在一个实际实数系统中,任何一个 specific 数都有一个无穷大的机会出现。实际上,双精度数没有无限分辨率,因此给定足够的时间,数字将再次出现,但是这种可能性很小,我们几乎可以忽略它。
如果您确实想消除此极小的问题,则需要采取更多的概率。每个要偏置的数字一个,每个偏置数字之间的互斥范围一个(因此不包括该数字)。