在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}
非常感谢!(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位甚至更多),或者这个数字能够处理它?