【问题标题】:generating random permutations and combinations (python 3.x)生成随机排列和组合(python 3.x)
【发布时间】:2020-05-01 12:42:08
【问题描述】:

我有用于计算任何给定集合的组合或排列数量的代码。

(math.comb(n,k)) 和 (math.perm(n,k)) 所以 perm = (math.perm(10,5)), perm == 30240 个排列

我想生成 n 和 k 的随机排列和组合,
所以如果 n = 10,k = 5,我会得到类似 3,7,1,2,9 作为烫发或梳子

我会为此使用什么数学函数?

编辑:
代码应该从 10 个随机选择中生成一个 k 值数组,并且对于组合删除每个值 (k),因为它是从主集 (n) 中选择的,因此没有 (n) 的重复。数学的分支是组合学(如果有帮助的话)
我确信必须有一个已经创建的函数。
我有数百万个数组要生成和处理。

【问题讨论】:

  • 30240 个排列并不算多,所以你可以创建一个列表,然后random.shuffle 他们。这样,您将获得所有可能排列的随机顺序。或者,如果您只需要其中几个,那么random.sample
  • 如果您还不熟悉,请查看排名和未排名。这是一种将随机索引转换为相应的n-choose-k选择的方法。我不熟悉 numpy 或 scipy 实现。
  • 到目前为止您尝试过什么?您是否一直在寻找 30000 顺序的排列?你有 2000 个元素的集合吗?
  • 请注意,默认的 Python PRNG 是 Mersenne Twister,周期为 2**19937-1。这不足以从大于 2080 个元素的集合的排列中随机抽取/洗牌。

标签: python python-3.x math combinations permutation


【解决方案1】:

您可以使用 Python 的 random 模块,它与 math 预包含相同(因此您不需要使用 pip 等安装它)。首先定义要从中随机选择 k 个元素的集合,在您的示例中,它是从 1 到 10 的整数集合,所以我使用 S=[i for i in range(1,11)](请记住,范围内的最后一个元素是您给出的整数之前的那个)它作为范围的终止)。然后在random 包中接收带有替换的k 元素使用choices 命令,对于没有替换的情况使用sample 命令。代码如下。

import random
S=[i for i in range(1,11)]
A=random.choices(S,k=5)
B=random.sample(S,5)

例如,当我要求 python 分别显示 S、A 和 B 后运行上述代码时,我收到以下结果。

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[8, 3, 2, 6, 8]
[3, 9, 6, 1, 10]

您也可以使用numpy 模块将定义S 与范围然后使用numpy.random.choice 的两个步骤结合起来。但请注意,您将从 0 而不是 1 开始的 10 个整数集合中选择 k 个。要从未定义为从 0 开始的 n 个后续整数的集合中进行选择,您应该再次定义它,与我们的第一个方法相同并给出它到这个命令,而不是只有一个数字,比如 10。要在不替换的情况下进行选择,您应该添加一个选项 replace=False。请参阅以下代码。

import numpy
C=numpy.random.choice(10,5)
D=numpy.random.choice(10,5,replace=False)
S=[i for i in range(1,11)]
A=numpy.random.choice(S,5)
B=numpy.random.choice(S,5,replace=False)

运行此程序并分别询问集合 C、D、A 和 B 后,我得到以下结果。

array([5, 5, 1, 4, 7])
array([0, 7, 4, 6, 1])
array([10,  5,  7,  1,  7])
array([6, 5, 7, 8, 1])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2016-07-15
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多