【问题标题】:How to generate random numbers which do not include zeros?如何生成不包含零的随机数?
【发布时间】:2021-01-05 16:13:53
【问题描述】:

我正在尝试创建一个程序,它可以在随机的数字中找到multiplicative persistence。然而,这个程序必须处理大量数字(>10233)。然而,当我使用random.randint(10**233, 10**400) 时,我不禁注意到绝大多数数字都包含一个零,这将导致 0 乘法持久性。在我的算法中,我试图通过以下方法摆脱这些数字:

def find_new_i():
    i = 10
    while "0" in str(i):
        i = random.randint(10**233,10**400)
    return i

但是,这种方法确实很慢,并且不能很快生成数字。

有人对更有效的方法有任何想法吗?

【问题讨论】:

  • 您是否尝试过显式生成不包含任何零的数字(例如,通过组装一串数字 1-9),而不是简单地生成所有值并丢弃其中的“绝大多数”?

标签: python python-3.x performance random integer


【解决方案1】:

在如此大的数字中出现 0 的几率非常高,这就是为什么 while 循环可能会重复多次。

最好用 1 到 9 之间的随机数字替换任何零。

def find_new_i():
    i = random.randint(10 ** 233, 10 ** 400)
    i = int(''.join(str(random.randint(1, 9)) if d == '0' else d for d in str(i)))
    return i

或者如果您不介意将所有零替换为相同的随机数字:

i = int(str(i).replace('0', str(random.randint(1, 9))))

在这个阶段,简单地“手动”构建数字可能更有意义(但是这种方法比上述方法慢大约 4 倍,请参阅 cmets):

def find_new_i():
    return int(''.join(str(random.randint(1, 9))
               for _ in range(random.randint(233, 400))))

【讨论】:

  • 10% 的数字在任何长的随机生成中都是零。数字——不确定我会称之为“非常高”。
  • @martineau 在 233-400 位数字中偶数个零位的几率实际上是 100%。例如计算1-0.9**233
  • @martineau - 10% 的数字是零,所以整个数字包含至少一个零的可能性是 1 - 0.9**n,随着数字的增加而增长非常高。跨度>
  • 您的第一个 find_new_i 比“手动”快四倍。
  • 这比第一个快 20%:int(''.join(choices('123456789',k=randint(233,400))))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
相关资源
最近更新 更多