【问题标题】:Select a number randomly with probability proportional to its magnitude from the given array of n elements从给定的 n 个元素数组中随机选择一个数字,其概率与其大小成正比
【发布时间】:2020-01-13 11:16:19
【问题描述】:

例 1:A = [0 5 27 6 13 28 100 45 10 79] 令 f(x) 表示 x 在 100 次实验中被选中的次数。 f(100) > f(79) > f(45) > f(28) > f(27) > f(13) > f(10) > f(6) > f(5) > f(0)

我的代码:

def pick_a_number_from_list(A,l):
    Sum = 0
    #l = len(A)
    for i in range(l):
        Sum+=A[i]
    A_dash = []
    for i in range(l):
        b=A[i]/Sum
        A_dash.append(b)
    #print(A_dash)
    series = pd.Series(A_dash)
    cumsum = series.cumsum(skipna=False)
    #print(cumsum[9])

    sample_value = uniform(0.0,1.0)
    r = sample_value
    print(r)
    #for i in range(l):
    if r<cumsum[1]:  
            return 1
    elif r>cumsum[1] and r <cumsum[2]:  
            return 2
    elif r<cumsum[3]: 
            return 3
    elif r<cumsum[4]: 
            return 4
    elif r<cumsum[5]: 
            return 5
    elif r<cumsum[6]:  
            return 6
    elif r<cumsum[7]: 
            return 7
    elif r<cumsum[8]: 
            return 8
    elif r<cumsum[9]:
            return 9


def sampling_based_on_magnitued():

    A = [0,5,27,6,13,28,100,45,10,79]
    n = len(A)
    #for i in range(1,10):
    num = pick_a_number_from_list(A,n)
    print(A[num])

sampling_based_on_magnitued()

在 mu 代码中,我使用了多个 if else 语句,因为它是硬编码的 我可以通过 o/p 直到列表中的 10 个元素。 我想让我的代码对于列表中的任何值都是动态的。

在我的代码中,我将其限制为 n=10

请告诉我如何正确使用 for 循环替换所有 if - elseif 语句的通用代码

【问题讨论】:

  • 你必须有一个for 循环吗?如果是这样,为什么?如果您不需要for 循环,则可以在需要单个样本时使用random.choices(A, weights=A),如果需要(例如)100 个样本,则可以使用random.choices(A, weights=A, k=100)。但请注意,虽然f(6) &gt; f(5) 经常为真,但它仍受随机性影响(就像所有其他比较一样)。
  • 没有限制。我想要实现的唯一条件是,而不是仅限于 size=10 的列表。大小应该是动态的,可能是 n=15。因此,无论 n 的值如何,我的代码都应该足够聪明,可以做同样的事情。请分享你的想法
  • 总是顺序值吗?

标签: python-3.x pandas random


【解决方案1】:
sum1=0;
for i in A:
    sum1+=i;
x=0
list1=[]
for i in A:
    list1.append(x+i/sum1)
    x=x+i/sum1;
#list1 contsins cumulative sum
bit=uniform(0,1)
for i in range (0,len(list1)):
    if bit<list1[i]:
        return A[i]

你可以用这个

【讨论】:

  • 你能帮我一步一步的执行流程吗?我很困惑。
【解决方案2】:

你可以使用 random.choices

A = [0,5, 27, 6, 13, 28, 100, 45, 10, 79]

让想要选择的随机值的数量为 100 s0 k=100

w = [0.0, 0.01597444089456869, 0.08626198083067092, 0.019169329073482427, 0.04153354632587859, 0.08945686900958466, 0.3194888178913738, 0.14376996805111822, 0.03194888178913738, 0.2523961661341853]

权重使用 A[i]/(A 的所有值的总和) 计算

x = random.choices(A,w,k=100)

print(x)

它根据权重显示列表 A 中的值

【讨论】:

    【解决方案3】:

    Bitan Guha Roy 的代码进行了一些更改,只返回一个值

    import numpy as np
    
    sum1=0;
    for i in A:
        sum1+=i;
    x=0
    list1=[]
    for i in A:
        list1.append(x+i/sum1)
        x=x+i/sum1;
    # list1 contains cumulative sum
    bit=np.random.uniform(0.0,1.0,1)
    for i in range (0,len(list1)):
        if bit>=list1[i] and bit<list1[i+1]:
            print(A[i+1])  # or return if under a function
    

    【讨论】:

      【解决方案4】:
      
      import random
      
      
      lst=[0, 5 ,27, 6, 13, 28, 100, 45, 10,79]   
      
      def pick_a_number_from_list(A):
          weights1=[]
          
          for i in A:
              weights1.append(i/sum(lst))
              
          selected_random_number = random.choices(A,weights=weights1,k=1)    
          
          return selected_random_number
      
      
      def sampling_based_on_magnitued():
          for i in range(1,100):
              number=pick_a_number_from_list(lst)
              print(number)
          
      
      sampling_based_on_magnitued()
      
      # used random.choices which gives option to choose random number according respective weights. Please suggest any modification if you've any
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      猜你喜欢
      • 2013-05-05
      • 2012-01-07
      • 1970-01-01
      • 2021-12-08
      • 2020-07-29
      • 2018-12-15
      • 2023-03-09
      • 1970-01-01
      • 2013-08-27
      相关资源
      最近更新 更多