【问题标题】:How to generate 20 unique random numbers with order using python?如何使用python按顺序生成20个唯一随机数?
【发布时间】:2015-10-17 08:23:38
【问题描述】:

我刚开始学习编程。当我逐章进行时,我开始遇到问题。最大的问题之一是当我遇到用python生成随机数的问题时。“生成20个随机唯一数并将它们排序一个顺序,无论是升序还是降序”。我已经研究过我该怎么做,但我现在很困惑,想放弃。谁能给我一个关于我该怎么做的例子和解释为此。

【问题讨论】:

标签: python


【解决方案1】:
>>> import random
>>> var = random.sample(range(1, 10000), 20)
>>> var
[4691, 1789, 9473, 4042, 8423, 5021, 2627, 2739, 6337, 4963, 5772, 9180, 2788, 1197, 1276, 3393, 7748, 9448, 3618, 1835]
>>> var.sort()
>>> var
[1197, 1276, 1789, 1835, 2627, 2739, 2788, 3393, 3618, 4042, 4691, 4963, 5021, 5772, 6337, 7748, 8423, 9180, 9448, 9473]

首先,您从给定范围内生成 20 个数字,然后使用 sort() 对其进行简单排序

【讨论】:

  • random.sample(population, k) 返回从总体序列中选择的唯一元素的 k 长度列表。用于无放回的随机抽样。 reference
  • @Clodion : random.sample() 仅在给定总体中有重复项时才返回重复项。 range(1,10000) 中没有重复项,因此不会返回任何重复项。但是对于例如random.sample([1]*20, 10) 将返回重复项。
【解决方案2】:

试试下面的代码:

import random
startValue = 5
endValue = 150
rangeOfNumbers = xrange(startValue, (endValue + 1))
count = 10
randomNumList = random.sample(rangeOfNumbers, count)
print "Unsorted list of random numbers", randomNumList
randomNumList.sort()
print "Sorted list of random numbers", randomNumList

你会得到以下输出:

Unsorted list of random numbers [131, 138, 137, 22, 23, 69, 21, 66, 12, 83]
Sorted list of random numbers [12, 21, 22, 23, 66, 69, 83, 131, 137, 138]

【讨论】:

    【解决方案3】:

    你可以使用随机模块:

    >>> from random import random
    >>> lst = sorted([random() for x in range(20)])
    

    回复:

    [0.023779304268199186, 0.09302269288440945, 0.09832361922809707, 0.25242017515656756, 0.3506703186883351, 0.35105790921933866, 0.36493338390569785, 0.4758485640689768, 0.5224413002068954, 0.5794797893890528, 0.5826667916581931, 0.6050065111356167, 0.6283016356471698, 0.6709347774971688, 0.680474965216515, 0.6871898214051998, 0.7105349504105246, 0.7362770892874505, 0.8778691065354278, 0.8980497474361055]
    

    或者,如果您想确保没有重复:

    from random import randint
    a_set = set()
    while True:
        a_set.add(randint(0, 1000))
        if len(a_set)==20:
            break
    lst = sorted(list(a_set))
    print(lst)
    

    结果:

    [6, 94, 132, 258, 370, 389, 407, 462, 468, 528, 637, 640, 677, 692, 704, 872, 875, 883, 889, 913, 999]
    

    【讨论】:

    • 这会产生重复的数字 - OP 需要数字是唯一的。
    • @mhawke:有浮动?重复数字是完全不可能的,你不这么认为吗?
    • 不太可能,但并非不可能。有区别。
    • 如果总体规模小于样本规模,此代码最终可能会陷入无限循环。
    【解决方案4】:
    import random
    
    
    def make_list_distinct(_l, wanted_lenght=20):
        current_list = list(set(_l))
        _ = 20 - len(current_list)
        if _ > 0:
            current_list = current_list + [random.randint(1, 2000) for i in range(_)]
            make_list_distinct(_l = current_list)
        else:
            final_list = sorted(current_list)
            print(final_list)
    
    if __name__ == '__main__':
    
        #a = [random.randint(1, 2000) for i in range(20)]
        a = [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
        make_list_distinct(a)
    

    【讨论】:

    • 如果你在第二个列表理解中得到重复的数字怎么办?
    • 仍然不太正确。第一次你可能只得到 18 个不同的随机数。 (不太可能,但可能。)您应该将 if i > 0 更改为 while i > 0,然后在 while 循环中重新计算 i。
    • 可能工作,但它一点也不好。只需使用random.sample()
    • @mhawke。当然,但我是在批评这项技术,而不是提供配方。
    • @saulspatz 我已经测试了 18 个重复数字以应对不太可能的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2012-12-29
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多