【问题标题】:Randomly factor a number into exactly three factors将一个数字随机分解为三个因子
【发布时间】:2021-03-13 17:53:13
【问题描述】:

我已经研究过可用的问题和答案,但没有一个真正适用于我的情况,所以就这样吧。

我正在使用 python 并尝试将数字 1800 分解为三个随机因子。我并不真正关心输出的格式。我可以使用一个元组、一个列表,甚至三个单独的变量数字。我也不担心让所有因素都受到同等重视。我的输出可能是 2,2,450 或 12,15,10 或其他任何值。

我最好的想法是使用素数分解 (2,2,2,3,3,5,5),创建三个随机子集,然后将每个子集中的项目相乘。我研究了多种方法,它们似乎都有一些问题。

ShuffleSplit 来自 scikitlearn 只会给我值的索引。所以我必须拆分,将值放入两个列表中,然后再次拆分并将值放入两个新列表中。这变成了很多行代码。

使用randint 可以让我找到素因数的子列表,将其放在一边,找到剩余素因数的另一个子列表,然后将每个列表相乘。这只是部分随机的,因为我必须确定要进入每个列表的因素数。

我可以使用itertools.permutations(或其他一些置换函数)生成一个随机排序的因子列表,然后手动将该列表分成三个列表。这与randint 方法具有相同的关注点,因为我必须指定在我的三个输出因子中的每一个中包含多少个小素因子。

列出所有可能的因素组合并随机选择一个在时间上并不可行。

用 Python 做这件事有什么好的(快速、简单和潜在可扩展的)方法?

【问题讨论】:

  • “列出所有可能的因素组合并随机选择一个在时间上是不可行的” - 为什么不呢?没有那么多。

标签: python factorization


【解决方案1】:

我假设您已经编写了生成素数和分解的代码。如果没有,网上有不到 200 行的代码。

所以你有一个素数列表,例如[2,2,2,3,3,5,5]

我认为您最好使用随机样本,而不是沿着您建议的路径走,因为它不会替换使用的数字。您知道第一个数字可以与素因子的数量一样大,减去二(因为您必须再有两个数字)。第二个数字将来自随机样本集,该样本集要么是 1(如果只有两个剩余数字,或者是介于 1 和剩余数字数量之间的随机数,负 1(因为,同样,你必须至少再加一个数字来组成三个)

这将为您提供第一组数字。我想你可以看到从那里去哪里。

import random

prime_factors = [2,2,2,3,3,5,5]

def rand_factors(lst):
    elem_for_first_factor = random.randint(1, len(prime_factors)-2)
    return [k for k in random.sample(prime_factors, elem_for_first_factor)]

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 2015-11-04
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多