使随机数更可能产生数字

时间:2015-07-16 18:52:19

标签: python numpy random

我正在使用x = numpy.random.rand(1)生成0到1之间的随机数。如何使x > .5的可能性比x < .5高2倍?

6 个答案:

答案 0 :(得分:27)

这是一个合适的名字!

只需对输入进行一些操作即可。首先将x设置为01.5的范围。

x = numpy.random.uniform(1.5)

x的{​​{1}}概率大于2/30.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()

Example histogram

答案 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))