根据统一分布随机选择列表中的数字

时间:2015-10-19 16:23:37

标签: python random

我有一个列表

a = [.5,.57,.67,.8,1,1.33,2,4]

绘制时看起来像这样: enter image description here

我需要在此列表中随机选择一个数字。在Python中,我通常会这样:

c = random.choice(a)

除此之外......这样做会使选择偏向较低的值(密度高于1左右,而不是4左右)。

我如何根据统一分布选择列表条目。如在c = random.random()* 3.5 + .5中,但实际从列表中选择?

2 个答案:

答案 0 :(得分:1)

您可以从统一分布中获取浮点数,然后选择列表中最接近此生成值的浮点数。像这样:

a = [.5,.57,.67,.8,1,1.33,2,4]
p = map(lambda x: abs(random.uniform(0,4) - x), a)
c = a[p.index(min(p))]

当然,鉴于您的列表已经排序,您可以更有效地完成它。

答案 1 :(得分:-1)

首先将所有元素按照其值划分为十组,然后从每组中随机选择特定数量(例如200个)的元素

g1 = []
g2 = []
g3 = []
g4 = []
g5 = []
g6 = []
g7 = []
g8 = []
g9 = []
g10 = []
for i, row in df.iterrows():

    if 0 <= row['attr'] < 0.1:
        g1.append(row['file_name'])
    elif 0.1 <= row['attr'] < 0.2:
        g2.append(row['file_name'])
    elif 0.2 <= row['attr'] < 0.3:
        g3.append(row['file_name'])
    elif 0.3 <= row['attr'] < 0.4:
        g4.append(row['file_name'])
    elif 0.4 <= row['attr'] < 0.5:
        g5.append(row['file_name'])
    elif 0.5 <= row['attr'] < 0.6:
        g6.append(row['file_name'])
    elif 0.6 <= row['attr'] < 0.7:
        g7.append(row['file_name'])
    elif 0.7 <= row['attr'] < 0.8:
        g8.append(row['file_name'])
    elif 0.8 <= row['attr'] < 0.9:
        g9.append(row['file_name'])
    else:
        g10.append(row['file_name'])
print(len(g1),len(g2),len(g3),len(g4),len(g5),len(g6),len(g7),len(g8),len(g9),len(g10))
print(len(g1)+len(g2)+len(g3)+len(g4)+len(g5)+len(g6)+len(g7)+len(g8)+len(g9)+len(g10))
random.seed(42)
file_lst_sub = random.sample(g1,200)+random.sample(g2,200)+random.sample(g3,200)+\
               random.sample(g4,200)+random.sample(g5,200)+random.sample(g6,200)+\
               random.sample(g7,200)+random.sample(g8,200)+random.sample(g9,200)