python - 在给定的翻转次数中找到特定数量的正面和反面的所有组合

标签 python itertools

我正在尝试计算给定硬币翻转次数的所有可能组合,目前使用 10 作为我的测试用例。我相信那是笛卡尔积,但我上一堂数学课是很久以前的事了。然而,扭曲是我想首先计算最可能的分布。这是我开始的代码:

import itertools
for x in itertools.product(['H','T'],repeat=10):
    print(x)
这将为我提供 10 次抛硬币的所有可能组合。但是第一个结果全是正面,这个可能性不大。我的想法是从一个均匀分布开始,5个正面和5个反面的所有组合,然后继续4个正面和6个反面(加上逆)、3个正面和7个反面(加上反面)等。但是,我不太确定是否可以使用 itertools 或其他一些内置模块或模块组合来做到这一点。
如果我使用这个:
import itertools
for x in itertools.permutations(['H','H','H','H','H','T','T','T','T','T']):
    print(x)
然后有很多重复,因为它认为每个“H”和“T”都是唯一的。关于如何解决这个问题的任何建议?

最佳答案

来自进口multiset_permutations .这将计算 252 个排列,(10!/5!/5!)

>>> from sympy.utilities.iterables import multiset_permutations
>>> for item in multiset_permutations(['H','H','H','H','H','T','T','T','T','T']):
    print(item)

['H', 'H', 'H', 'H', 'H', 'T', 'T', 'T', 'T', 'T']
['H', 'H', 'H', 'H', 'T', 'H', 'T', 'T', 'T', 'T']
['H', 'H', 'H', 'H', 'T', 'T', 'H', 'T', 'T', 'T']
['H', 'H', 'H', 'H', 'T', 'T', 'T', 'H', 'T', 'T']
['H', 'H', 'H', 'H', 'T', 'T', 'T', 'T', 'H', 'T']
['H', 'H', 'H', 'H', 'T', 'T', 'T', 'T', 'T', 'H']
['H', 'H', 'H', 'T', 'H', 'H', 'T', 'T', 'T', 'T']
['H', 'H', 'H', 'T', 'H', 'T', 'H', 'T', 'T', 'T']
['H', 'H', 'H', 'T', 'H', 'T', 'T', 'H', 'T', 'T']
['H', 'H', 'H', 'T', 'H', 'T', 'T', 'T', 'H', 'T']
['H', 'H', 'H', 'T', 'H', 'T', 'T', 'T', 'T', 'H']
['H', 'H', 'H', 'T', 'T', 'H', 'H', 'T', 'T', 'T']
['H', 'H', 'H', 'T', 'T', 'H', 'T', 'H', 'T', 'T']
['H', 'H', 'H', 'T', 'T', 'H', 'T', 'T', 'H', 'T']
['H', 'H', 'H', 'T', 'T', 'H', 'T', 'T', 'T', 'H']
...
['T', 'T', 'T', 'H', 'H', 'T', 'H', 'T', 'H', 'H']
['T', 'T', 'T', 'H', 'H', 'T', 'T', 'H', 'H', 'H']
['T', 'T', 'T', 'H', 'T', 'H', 'H', 'H', 'H', 'T']
['T', 'T', 'T', 'H', 'T', 'H', 'H', 'H', 'T', 'H']
['T', 'T', 'T', 'H', 'T', 'H', 'H', 'T', 'H', 'H']
['T', 'T', 'T', 'H', 'T', 'H', 'T', 'H', 'H', 'H']
['T', 'T', 'T', 'H', 'T', 'T', 'H', 'H', 'H', 'H']
['T', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'H', 'T']
['T', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T', 'H']
['T', 'T', 'T', 'T', 'H', 'H', 'H', 'T', 'H', 'H']
['T', 'T', 'T', 'T', 'H', 'H', 'T', 'H', 'H', 'H']
['T', 'T', 'T', 'T', 'H', 'T', 'H', 'H', 'H', 'H']
['T', 'T', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'H']
编辑: OP 提到在某些情况下这可能会超出递归限制。这里有一些计算,实际上,multiset_permutation 的项目数可能会变得非常大。我想你需要知道你的集合有多大。
>>> from math import comb
>>> '{:,}'.format(comb(50,25))
'126,410,606,437,752'
>>> '{:,}'.format(comb(20,10))
'184,756'
>>> '{:,}'.format(comb(10,5))
'252'

关于python - 在给定的翻转次数中找到特定数量的正面和反面的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62779914/

相关文章:

python - 在赋值错误之前引用事件变量,我不知道如何修复它

jquery - 如何在 Django 中创建多选框?

python - 在父函数中使用子函数覆盖的值

python |给定每个索引的特定范围的数字,如何将主列表中的值分组到不同的列表中

python - 唯一值的动态分配 - Python

python - 如何在 PyQt5 中删除 Qlabel

python - 如何使 itertools 组合 'increase' 均匀?

python - 压缩的 Python 生成器,第二个更短 : how to retrieve element that is silently consumed

python - 如何为 DNA 序列生成一个热编码?

Python如何一次读取N行