我正在尝试计算给定硬币翻转次数的所有可能组合,目前使用 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/