【问题标题】:random to produce duplicated elements随机产生重复元素
【发布时间】:2019-03-20 08:39:27
【问题描述】:

使用随机模块时

In [1]: from random import *                                                                                                  

In [2]: sample([10, 20, 30, 40, 50], k=4)                                                                                     
Out[2]: [20, 30, 50, 10]

结果不是完全随机的

怎么会产生这样的结果

In [2]: sample([10, 20, 30, 40, 50], k=4)                                                                                     
Out[2]: [20, 20, 20, 10]

生成重复的元素。

【问题讨论】:

标签: python python-3.x random


【解决方案1】:

sample 是错误的工具,正如您所见。相反,您可以使用choices:

choices([10, 20, 30, 40, 50], k=4)     

【讨论】:

    【解决方案2】:

    您可以尝试使用 Python 的标准 random.choices,您可以在其中为您生成的每个元素指定可选权重。 Docs:

    choices([10, 20, 30, 40, 50], weights=[5, 50, 10, 15, 10], k=4)
    

    输出

    [40, 20, 50, 20]
    

    【讨论】:

      【解决方案3】:

      您可以使用numpy.random.choice

      import numpy as np
      
      x = [10, 20, 30, 40, 50]
      
      print(np.random.choice(x, 4, replace=True))
      

      输出:

      [50 50 30 30] 
      

      【讨论】:

        【解决方案4】:

        您正在寻找的是random.choices - Python 3.6 版中的新功能。 - 函数定义如下;你可以阅读更多here

        random.choices(population, weights=None, *, cum_weights=None, k=1)
        

        您可以分配weights 以使特定元素优先于其他元素。 - 虽然我相信下面的例子会满足你的需求。

        示例

        import random
        
        random.choices([1, 2, 3, 4], k=4)
        

        或者,在较旧的 Python 版本中,您可以使用random.choice,如下所示;虽然它只支持一个参数,一个序列。

        示例

        import random
        
        population = [1, 2, 3, 4, 5]
        
        def choices(population, k=1):
            return [random.choice(population) for _ in range(k)] if k > 1 else random.choice(population)
        
        choices(population, k=5)
        

        输出

        [2, 4, 2, 5, 1]
        

        【讨论】:

          猜你喜欢
          • 2016-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-05
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 2010-09-17
          相关资源
          最近更新 更多