【问题标题】:Generate random Numbers in Ascending order?按升序生成随机数?
【发布时间】:2020-01-19 09:35:51
【问题描述】:

如何在循环中像这样按升序生成随机数并将它们附加到列表中

12345 12346 12347 12348.....

试过了,这段代码会生成随机整数,需要按升序排列。

lists = []
for z in range(3000):
    lists.append((randint(12345,13333)))

lists_1=[str(cell) for  cell in lists_phone]
print(lists_1)

【问题讨论】:

    标签: python python-3.x for-loop random


    【解决方案1】:

    只需生成整数然后对它们进行排序。在 Python 中,sort() 对列表进行排序:

    listvar = [randint(12345,13333) for _ in range(3000)]
    listvar.sort()
    print(listvar)
    

    【讨论】:

    • 两个警告: 1. 调用变量list 将覆盖内置的list(顺便说一句,将set 命名为list 并不是最好的主意)。 2.创建集合后,由于消除了重复,条目的数量可能会减少。
    • @Matthias:我编辑了我的答案,尤其是提问者添加的第二部分,以解决您的 cmets。查看编辑历史记录。
    • 感谢您的更改。这可能会阻止我们稍后提出“列表不再起作用”之类的问题。
    • 没有必要先排序再转换成set,顺序会丢失。此外,如果有个重复,那么在转换为一个集合后,数字将少于 3000 个。
    【解决方案2】:

    如果你必须一个一个地生成它们并且它们必须已经是有序的:

    lists = []
    min = 12345
    max = 13333
    for z in range(3000):
        lists.append(max * z + (randint(min,max)))
    
    lists_1=[str(cell) for  cell in lists_phone]
    print(lists_1)
    

    但您真正要找的可能是@Peter O. 答案。

    【讨论】:

      【解决方案3】:

      numpy 对@Peter O 方法的版本。如果您已经拥有 numpy,则可以使用它来获得更好的性能:

      import numpy as np
      from timeit import Timer
      from random import randint
      
      print(min(Timer(lambda: [randint(12345, 13333) for _ in range(3000)].sort()).repeat(100, 100)))
      print(min(Timer(lambda: np.random.randint(12345, 13333, 3000).sort()).repeat(100, 100)))
      

      输出

      0.5073430000000023
      0.016132899999999673
      

      Numpy 快 31 倍

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-03
        相关资源
        最近更新 更多