使随机产生的数字更有可能

问题描述 投票:0回答:7

我正在使用

x = numpy.random.rand(1)
生成 0 到 1 之间的随机数。如何使
x > .5
的概率是
x < .5
的 2 倍?

python numpy random
7个回答
28
投票

这个名字很合适!

只需对输入进行一些操作即可。 首先将

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

20
投票

这对你来说有点过分了,但是了解使用任何概率密度函数生成随机数的实际方法(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()

Example histogram


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
投票

首先,

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

1
投票

您可以采用“混合模型”方法,将过程分为两个步骤:首先,决定是采取选项 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)

这有点贵(两次随机抽取而不是一次),但它可以以相当简单的方式推广到更复杂的分布。


0
投票

如果你想要更流畅的随机性,你可以对随机函数的输出进行平方

(并从 1 中减去它,使

x > 0.5
更有可能出现,而不是
x < 0.5
)。

x = 1 - sqr(numpy.random.rand(1))

0
投票

随机

def select_multiplayer(1): # 定义范围和概率 低概率范围 = (1, 5) 高概率范围 = (6, 30


© www.soinside.com 2019 - 2024. All rights reserved.