使随机数更可能产生数字

ran*_*dom 22 python random numpy

我正在使用x = numpy.random.rand(1)0到1之间生成一个随机数.如何使它成为x > .5可能的2倍x < .5

AZh*_*hao 27

这是一个合适的名字!

只需对输入进行一些操作即可.首先设置x在从0到的范围内1.5.

x = numpy.random.uniform(1.5)
Run Code Online (Sandbox Code Playgroud)

x2/3可能变得更大0.5,1/3机会更小.然后如果x大于1.0,则减去.5

if x >= 1.0:
    x = x - 0.5
Run Code Online (Sandbox Code Playgroud)


Joe*_*oel 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()
Run Code Online (Sandbox Code Playgroud)

直方图示例


Jor*_*ley 8

tmp = random()
if tmp < 0.5: tmp = random()
Run Code Online (Sandbox Code Playgroud)

这是非常简单的方法

呃,我想这可能是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 :)
Run Code Online (Sandbox Code Playgroud)

  • @JoranBeasley这实际上是[Monty Hall Problem](https://en.wikipedia.org/wiki/Monty_Hall_problem)背后逻辑的变体.你正在做的事情有25%的几率达到<0.5.一半的时间你会得到> 0.5,这是真的.另一半的时间,_that_时间的一半,它将> 0.5并且是真的.那一半的另一半是假的. (3认同)