我正在使用
x = numpy.random.rand(1)
生成 0 到 1 之间的随机数。如何使 x > .5
的概率是 x < .5
的 2 倍?
这个名字很合适!
只需对输入进行一些操作即可。 首先将
x
设置在从 0
到 1.5
的范围内。
x = numpy.random.uniform(1.5)
x
的 2/3
几率大于 0.5
且 1/3
几率更小。 然后,如果 x
大于 1.0
,则从中减去 .5
if x >= 1.0:
x = x - 0.5
这对你来说有点过分了,但是了解使用任何概率密度函数生成随机数的实际方法(pdf)是件好事。
您可以通过子类化 scipy.stat.rv_continuous 来做到这一点,前提是您做得正确。您必须有一个标准化的 pdf(以便其积分为 1)。如果你不这样做,numpy 会自动为你调整范围。在本例中,x<0.5, and 4/3 for x>0.5 的 pdf 值为 2/3,支持度为 [0, 1)(支持度是非零的区间):
import scipy.stats as spst
import numpy as np
import matplotlib.pyplot as plt
import ipdb
def pdf_shape(x, k):
if x < 0.5:
return 2/3.
elif 0.5 <= x and x < 1:
return 4/3.
else:
return 0.
class custom_pdf(spst.rv_continuous):
def _pdf(self, x, k):
return pdf_shape(x, k)
instance = custom_pdf(a=0, b=1)
samps = instance.rvs(k=1, size=10000)
plt.hist(samps, bins=20)
plt.show()
tmp = random()
if tmp < 0.5: tmp = random()
这是非常简单的方法
呃,我想这是 3 倍的可能性……我想这就是我在这堂课上睡觉得到的结果
from random import random,uniform
def rand1():
tmp = random()
if tmp < 0.5:tmp = random()
return tmp
def rand2():
tmp = uniform(0,1.5)
return tmp if tmp <= 1.0 else tmp-0.5
sample1 = []
sample2 = []
for i in range(10000):
sample1.append(rand1()>=0.5)
sample2.append(rand2()>=0.5)
print sample1.count(True) #~ 75%
print sample2.count(True) #~ 66% <- desired i believe :)
首先,
numpy.random.rand(1)
不返回[0,1)
范围内的值(半开,包括零但不包括一),它返回一个大小为1的数组,包含该范围内的值,范围的上限与传入的参数无关。
您可能需要的函数是均匀分布函数,
numpy.random.uniform()
,因为这将允许任意上限范围。
而且,让上半部分的可能性翻倍是一件相对简单的事情。
以随机数生成器
r(n)
为例,它返回 [0,n)
范围内的均匀分布整数。您需要做的就是调整值来改变分布:
x = r(3) # 0, 1 or 2, @ 1/3 probability each
if x == 2:
x = 1 # Now either 0 (@ 1/3) or 1 (@ 2/3)
现在获得 0 的机会是 1/3,而获得 1 的机会是 2/3,基本上就是您想要通过浮点值实现的目标。
所以我会简单地得到一个在
[0,1.5)
范围内的随机数,然后如果它大于或等于1则减去0.5。
x = numpy.random.uniform(high=1.5)
if x >= 1: x -= 0.5
由于原始分布在
[0,1.5)
范围内应该是均匀的,因此减法应该使 [0.5,1.0)
的可能性加倍(并且 [1.0,1.5)
不可能),同时保持每个部分内的分布均匀([0,0.5)
和 [0.5,1)
) :
[0.0,0.5) [0.5,1.0) [1.0,1.5) before
<---------><---------><--------->
[0.0,0.5) [0.5,1.0) [0.5,1.0) after
您可以采用“混合模型”方法,将过程分为两个步骤:首先,决定是采取选项 A 还是 B,其中 B 的可能性是 A 的两倍;那么,如果您选择 A,则返回 0.0 到 0.5 之间的随机数,否则如果您选择 B,则返回 0.5 到 1.0 之间的一个。
在示例中,randint 随机返回 0、1 或 2,因此
else
情况的可能性是 if
情况的两倍。
m = numpy.random.randint(3)
if m==0:
x = numpy.random.uniform(0.0, 0.5)
else:
x = numpy.random.uniform(0.5, 1.0)
这有点贵(两次随机抽取而不是一次),但它可以以相当简单的方式推广到更复杂的分布。
如果你想要更流畅的随机性,你可以对随机函数的输出进行平方
(并从 1 中减去它,使
x > 0.5
更有可能出现,而不是 x < 0.5
)。
x = 1 - sqr(numpy.random.rand(1))
随机
def select_multiplayer(1): # 定义范围和概率 低概率范围 = (1, 5) 高概率范围 = (6, 30