在Python 3.8.2中,从至少有N个唯一数字的特定集合生成所有数字

在Python 3.8.2中,从至少有N个唯一数字的特定集合生成所有数字,python,python-3.x,Python,Python 3.x,如何生成1-K之间的所有数字,使它们之间的任何数字只包含以下数字:{1,3,5,7,9}并且它们至少有3个唯一数字 例如,这些数字是不允许的: 11、1133333、151322(第一个和第二个确实只包含{1,3,5,7,9}中的数字,但是它们没有此集合中的至少3个唯一数字。第三个包含不在该集合中的数字2。) 这些数字没有问题: 15711115755591199913 到目前为止我所拥有的(使用此帖子:) 用亚图善意的回答: from numpy.random import choice od

如何生成
1-K
之间的所有数字,使它们之间的任何数字只包含以下数字:
{1,3,5,7,9}
并且它们至少有3个唯一数字

例如,这些数字是不允许的:
11、1133333、151322(第一个和第二个确实只包含
{1,3,5,7,9}
中的数字,但是它们没有此集合中的至少3个唯一数字。第三个包含不在该集合中的数字2。)

这些数字没有问题:
15711115755591199913

到目前为止我所拥有的(使用此帖子:) 用亚图善意的回答:

from numpy.random import choice
odds = ['1','3','5','7','9']

n_digits = 6 # up to 99999 for ex
range_digits = list(range(1,n_digits))

weights = [5**i for i in range_digits]
weights_sum = sum(weights)
probs = [i/weights_sum for i in weights]

sizes = choice(range_digits,size=20,p=probs)
a = [int(''.join(choice(odds,size))) for size in sizes]
但是,我需要改变两件事:

  • 我需要确保这些数字至少包含来自
    {1,3,5,7,9}
  • 我需要按升序生成它们,而不是使用随机选取。也就是说,如果范围是100-1000,那么它将返回:137、173、317、371等等…直到它达到973,这是满足这些条件的最大数字

  • 非常感谢!(Python 3.8.2)

    如果使用升序,那么它就不会是随机的;如果使用随机拾取,那么它就不会是升序的

    一种可能是使用升序生成可能的候选编号,然后剔除不合适的编号

    由于您只允许使用5位数字[1,3,5,7,9],我建议您按基数5的升序进行计数,并将5位基数5的数字[0,1,2,3,4]映射到允许的奇数基数10位数字上。因此42201(基数5)映射到奇数基数10中的95513。然后42202(基数5)将给出95515(基数10),依此类推


    这将只使用允许的数字生成升序数字。您必须单独测试每个数字,以查看它是否符合三个不同的数字规则。

    如果数字范围不太大,您可以生成所有/大部分数字,并过滤掉不符合要求的数字

    def requirement(n):
        s = set(str(n))
        return len(s) > 2 and len(s & {'0','2','4','6','8'}) == 0
    
    numbers = filter(requirement, range(start | 1, end, 2))
    

    如果数字的范围很大,此方法可能效率低下。

    问题是,对于start=100和end=1000,它会返回这些数字:{102、104等..}这是不允许的+它不检查集合中的3个唯一数字在注释中我说开始应该是奇数。我将代码更改为
    start|1
    ,以确保它以奇数开始。但它仍然包含集合中不存在的数字
    {1,3,7,9}
    Doh。有一组整数({0,2,…})而不是一组字符({'0','2',…})。修复。谢谢!关于大数字,你会怎么做?因为我处理的是非常大的数字(8-10位甚至更多),或者这个数字能够处理它?