【问题标题】:Python Random Int Script Help - Printing Number of LinesPython Random Int 脚本帮助 - 打印行数
【发布时间】:2014-08-20 16:51:34
【问题描述】:

这是我创建的脚本,它生成 1-49 之间的 6 个随机数,然后确保没有匹配并打印结果,一切正常,除了我想添加一些行函数来打印出我想要的多行.这就是问题所在,我只能让它打印相同的数字 5 次,而不是 5 组不同的数字。

import random

def numbers():
    global a,b,c,d,e,f
    a = random.randint(1,49)
    b = random.randint(1,49)
    c = random.randint(1,49)
    d = random.randint(1,49)
    e = random.randint(1,49)
    f = random.randint(1,49)
numbers()
while(a==b or a==c or a==d or a==e or a==f or b==c or b==d or b==e or b==f or c==d or c==e or c==f or d==e or d==f or e==f):
    numbers()
sep = ' '
nums = 'Numbers: '+str(a)+sep+ str(b)+sep+str(c)+sep+str(d)+sep+str(e)+sep+str(f)

print nums

这是最有效的方法吗?上面有什么要质疑的想法吗?

非常感谢

【问题讨论】:

    标签: python random


    【解决方案1】:

    首先,您应该为此应用程序使用random.sample。它无需替换即可挑选出数字,因此以后无需进行任何唯一性检查。此函数获取要选择的元素列表以及要选择的元素数量,无需替换。由于我们希望它从数字 1 到 49 中进行选择,因此我们可以使用 range(1, 50) 创建该列表。

    其次,不要将每个数字保存在单独的变量中,只需将其返回到列表中即可。这就是random.sample 默认返回的方式,所以就使用它吧。

    第三,这里不需要使用全局变量。只需从函数返回数字列表,将其分配给一个变量,然后再使用它。

    第四,对于打印,使用' '.join(list_of_strings)自动插入分隔符。当然,首先我们必须将random.sample 返回的整数列表转换为字符串列表,我们可以使用list comprehension 来完成。这种方法的好处是可以处理任意数量的数字,只要您先将它们存储在列表中即可。

    综合起来:

    import random
    
    def random_numbers(n):
        return random.sample(range(1, 50), n)
    
    numbers = random_numbers(6)
    numbers_str = ' '.join([str(num) for num in numbers])
    print('Numbers: ' + numbers_str)
    

    我不确定“行数”功能应该是什么。您只是想多次重复上述操作吗?然后你只需要多次重复上述操作即可。

    num_lines = 10
    
    for i in range(num_lines):
        numbers = random_numbers(6)
        numbers_str = ' '.join([str(num) for num in numbers])
        print('Numbers: ' + numbers_str)
    

    【讨论】:

      【解决方案2】:

      根据定义,set 不能包含任何非唯一值。所以我会继续生成随机数并尝试添加到您的set。一旦set 达到6 的大小,您就知道您拥有6 唯一值。然后你可以打印你的集合,或者转换成一个列表,或者任何你想做的事情。

      import random
      s = set()
      while len(s) < 6:
          s.add(random.randint(1,49)) 
      
      >>> s
      set([2, 6, 10, 43, 13, 47])
      

      作为一个函数,它使一组特定大小的 setSize 从值 1 到 maxVal

      def makeRandomSet(setSize, maxVal):
          s = set()
          while len(s) < setSize:
              s.add(random.randint(1,maxVal))
          return s
      

      测试功能

      >>> makeRandomSet(10, 30)
      set([3, 5, 11, 14, 21, 23, 24, 25, 26, 29])
      

      【讨论】:

      • 那里的效率很好,谢谢,任何想法如何添加多行 (-l) 功能?
      【解决方案3】:

      使用内置函数一次完成所有操作怎么样?

      import random
      random.sample(range(1,49),6)
      

      样本输出

      [45, 37, 24, 15, 38, 48]
      

      【讨论】:

      • 无需使用 numpy 或将其制成集合。只需使用内置的 range(或 2.x 上的 xrange)函数作为参数。
      【解决方案4】:

      我建议进行两项改进。在numbers 中使用while 循环来生成唯一的随机数。然后使用sep.join 函数打印它们。

      import random
      
      def numbers():
          n = []
          while len(n)<6:
              x = random.randint(1,49)
              if x not in n:
                  n.append(x)
          return n
      
      sep = ' '
      for row in range(5):
          print( 'Numbers: '+ sep.join(str(x) for x in numbers()) )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-10
        • 2022-01-04
        • 2012-02-21
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多