我正在使用x = numpy.random.rand(1)
生成0到1之间的随机数。如何使x > .5
的可能性比x < .5
高2倍?
答案 0 :(得分:27)
这是一个合适的名字!
只需对输入进行一些操作即可。首先将x
设置为0
到1.5
的范围。
x = numpy.random.uniform(1.5)
x
的{{1}}概率大于2/3
且0.5
的概率小于1/3
。然后,如果x
大于1.0
,则从中减去.5
if x >= 1.0:
x = x - 0.5
答案 1 :(得分:16)
这对您来说太过分了,但了解使用任何概率密度函数(pdf)生成随机数的实际方法会很有用。
如果你正确地做了,你可以通过继承scipy.stat.rv_continuous来做到这一点。您将必须具有标准化的pdf(以使其积分为1)。如果你没有,numpy会自动为你调整范围。在这种情况下,对于x <0.5,你的pdf值为2/3,对于x> 0.5,你的pdf值为4/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()
答案 2 :(得分:8)
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 :)
答案 3 :(得分:3)
首先,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)
现在获得零的几率是1/3,而获得一个的机会是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
答案 4 :(得分:1)
你可以选择&#34;混合模型&#34;将流程分为两个步骤的方法:首先,决定是选择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)
这有点贵(两个随机抽取而不是一个),但它可以以相当直接的方式推广到更复杂的分布。
答案 5 :(得分:0)
如果你想要更流畅的随机性,你可以将随机函数的输出平方
(并从1中减去它以使x > 0.5
更可能而不是x < 0.5
)。
x = 1 - sqr(numpy.random.rand(1))