如何在Python中有效生成仅包含唯一数字的随机数?

3
import random

def get_number(size):
  result = [random.randint(1,9)]
  digits = list(range(0,10))
  digits.remove(result[0])
  if(size > 1):
    result += random.sample(digits,size-1)
  return ''.join(map(str,result))

print(get_number(4))

我解决了这个问题,但是我感觉它很笨重。 如何更有效、更优雅地解决这个问题?


6
获取所有数字(string.digits),对其进行随机洗牌(random.shuffle),然后根据需要的长度进行切片(...[:size])。 - jonrsharpe
严格来说,洗牌整个列表比必要的工作更多。您不需要洗牌您不打算返回的数字。是否有一种“shuffle”的变体可以生成给定大小的随机子集? - sh1
2个回答

1

@jonrsharpe建议使用洗牌方法:

import random

def get_number(size):
    l = [ str(i) for i in list(range(10))]
    while l[0] == '0':
        random.shuffle(l)
    return int("".join(l[:size]))

限制:

  • 如果您请求的数字超过10位,您将只获得10位数字
  • 如果首位数字为0,则可能需要一些步骤

0

只需使用shuffle:

import string

x = list(string.digits)
random.shuffle(x)

print int(str(random.choice(range(1, 10))) + "".join(x[:3]))

这些数字(由于第一位数字的生成方法)不一定只包含唯一的数字。但是这个想法很好,你只需要在连接数的尾部之前从x中删除那个第一位数字就可以了。 - BlackCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接