首页 > 解决方案 > python中的random.choice,元素的均匀分布

问题描述

我在 python 中编写了一个函数,它以这种格式生成字典:

{"A":20,"T":20,"G":30,"C":30} 我希望在 GC 40%-60% 的范围内生成每个值

def makeDict(gcRange, min):
     maxC = gcRange[1]-min
     probC = random.choice(np.arange(min, maxC, 2))
     gc = [gcRange[0]-probC, gcRange[1]-probC]
     probG = random.choice(np.arange(gc[0], gc[1], 2))
     at = 100 - probC - probG
     probA = at/2
     probT = at/2
     return({"A":probA, "T":probT, "G":probG, "C":probC})
d=[]
for i in range(1,1000):
    d.append(makeDict([40,60],10))

我知道 random.choise 发生替换,而 random.sample 发生而不替换。我希望它可以替换,因为我要生成 1000 个字典。但是,当我在循环中生成 1000 个字典时,我希望随机选择这些值的均匀分布。random.choice 函数中是否已经发生这种情况,还是我需要设置权重?如果是,如何?在函数中还是在for循环中?另外,为什么如果我执行 print(len(d)) 它会显示 999 而不是 1000?此外,有时我会得到负值。为什么?

标签: pythonrandom

解决方案


是的,有时,您可以获得负值。这是正常的。

  • gcRange = [40,60] 和 mini = 10(将​​ min 替换为 mini)
  • maxC = gcRange[1]-mini // maxC = 50
  • probC = random.choice(np.arange(mini, maxC, 2)) // probC 可能需要 50 (maxC)
  • gc = [gcRange[0]-probC, gcRange[1]-probC] // gc = [40-50, 60 -50] = [-10, 10]
  • probG = random.choice(np.arange(gc[0], gc[1], 2)) // 所以 probG 可能是负数

推荐阅读