【问题标题】:Making 6 different random Numbers制作 6 个不同的随机数
【发布时间】:2017-05-26 17:44:32
【问题描述】:

我现在不擅长编码,我正在努力改进和学习。 ATM 我试图编写一个随机选择 6 个非重复数字的代码,但我失败了。我该怎么办?

import random

a = random.randint(1, 100)
b = random.randint(1, 100)
c = random.randint(1, 100)
x = random.randint(1, 100)
y = random.randint(1, 100)
z = random.randint(1, 100)

outa = b, c, x, y, z
outb = a, c, x, y, z
outc = a, b, x, y, z
outx = a, b, c, y, z
outy = a, b, c, x, z
outz = a, b, c, x, y

all = a, b, c, x, y, z

while a in outa or b in outb or c in outc or x in outx or y in outy or z in outz:
    if a in outa:
        a = random.randint(1,100)
    elif b in outb:
        b = random.randint(1,100)
    elif c in outc:
        c = random.randint(1,100)
    elif x in outx:
        x = random.randint(1,100)
    elif y in outy:
        y = random.randint(1,100)
    elif z in outz:
        z = random.randint(1,100)

print(all)

【问题讨论】:

  • 你了解列表吗?
  • “随机抽取6个不重复的数字”random.sample(range(1, 100), 6)
  • 此问题中使用sample 的所有建议(我的除外)都缺少该范围内的 100。 range 不包含结束值,但 randint 包含。

标签: python random numbers non-repetitive


【解决方案1】:

random 中有一个函数可以做到这一点:

all = random.sample(range(1,101), 6)

如果可能值的列表太大而无法构建,那么您的算法很好,但使用列表更好:

all = []
while len(all) < 6:
    x = random.randint(1, 10000000)
    if not x in all:
        all.append(x)

如果您的列表比6 大得多,您可以考虑使用set 而不是list

更新:实际上,random.sample() 非常聪明,而使用 python3 的代码:

all = random.sample(range(1,10000000001), 6)

工作得很好,而这个:

all = random.sample(list(range(1,10000000001)), 6)

吃掉我所有的记忆。

如果你使用python2,你可以使用xrange而不是range来获得同样的效果。

【讨论】:

    【解决方案2】:
    all = a, b, c, x, y, z
    

    这样的事情会创建一个 values 的元组。因此,在该行执行时,该元组内部具有固定值并且无法更改。当您更新最初用于构造它的变量之一时,它尤其不会改变。因此,您不能使用 all 作为最终结果,也不能使用 outX 元组来检查任何重复项,因为它们已修复且不会更新。

    为了让您的代码正常工作,您必须在 while 循环的每次迭代中重新创建所有这些元组。但总的来说,您很快就会注意到拥有这些显式变量并不是一个好主意。

    如果您想继续使用randint,那么您可以一次只生成一个号码,并在遇到已有号码时“重新滚动”:

    numbers = []
    while len(numbers) < 6:
        num = random.randint(1, 100)
        if num not in numbers:
            numbers.append(num)
    

    我在这里使用了一个列表,它是一个可变的数据结构来收集多个值(相对于元组,它是不可变的)。

    您还可以在此处使用random.sample,它提供了一种更简单的方法来从一系列数字中获取任意数量的唯一值:

    numbers = random.sample(range(1, 100), 6)
    

    【讨论】:

      【解决方案3】:

      您可以使用random.sample 创建一个生成 6 个唯一数字的列表,而不是创建 6 个不同的变量:

      import random
      
      nums = random.sample(range(1,100), 6)
      print (nums)
      
      Output:
      [2,34,5,61,99,3]
      

      【讨论】:

        【解决方案4】:

        像这样:

        random.sample(range(1,100), 6)
        

        【讨论】:

        • 在采样之前将range() 转换为set 的任何理由似乎都会使相同结果的速度明显变慢。
        • 我认为你是对的,不需要设置。我会编辑。
        猜你喜欢
        • 2015-03-31
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2012-12-15
        相关资源
        最近更新 更多