开发者社区> 问答> 正文

如何生成数字序列的随机列表?

我希望函数生成一个长度为n的列表,其中包含一个介于0到1之间的数字的算术序列,但要以随机顺序放置。

例如,对于功能

def randSequence(n):
    ...
    return myList



randSequence(10)

退货

[0.5, 0.3, 0.9, 0.8, 0.6, 0.2, 0.4, 0.0, 0.1, 0.7]

randSequence(5)

退货

[0.4, 0.0, 0.2, 0.8, 0.6]

目前,我拥有它,因此它可以在一个循环中生成数字序列,并在另一个循环中将其随机化,如下所示:

def randSequence(n):
    step = 1 / n
    setList = []
    myList = []
    for i in range(n):
        setList.append(i * step)
    for i in range(n):
        index = random.randint(0, len(setList) - 1)
        myList.append(setList.pop(index))
    return myList

不幸的是,这种解决方案很慢,尤其是对于大量的问题(例如n> 1,000,000)。有没有更好的方法来编写此代码,或者甚至更好,是否有可以为我完成此任务的函数?

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 10:03:01 574 0
1 条回答
写回答
取消 提交回答
  • 首先,我想指出您的代码性能不佳的主要原因是由于以下原因:

    myList.append(setList.pop(index))
    

    列表中间的时间复杂度list.pop大约是O(n),因为从列表中间弹出会迫使Python移动一堆内存。这使得网络复杂度为O(n ^ 2)。您可以通过就地进行更改来大幅度提高性能,例如:

    def randSequenceInplace(n):
        'a.k.a. Fisher-Yates'
        step = 1 / n
        lst = [step * i for i in range(n)]
        for i in range(n-1):
            index = random.randint(i, n - 1)
            lst[i], lst[index] = lst[index], lst[i]
            # myList.append(setList.pop(index))
        return lst
    

    *为了完整起见,您可以使用矢量化numpy解决方案,也可以使用前面提到的random.shuffle以获得更好的性能。时间: n = 10*6 %time randSequence(n) # CPU times: user 1min 22s, sys: 33 ms, total: 1min 22s # Wall time: 1min 22s %time randSequenceInplace(n) # CPU times: user 1.33 s, sys: 1.91 ms, total: 1.33 s # Wall time: 1.33 s %timeit np.random.permutation(n) / n # 10 loops, best of 3: 22.4 ms per loop

    回答来源:stackoverflow

    2020-03-24 10:03:09
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载