我怎样才能遍历n张扑克牌的每种可能的组合
如何循环遍历一副标准 52 张牌中的 n 张扑克牌的所有组合?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何循环遍历一副标准 52 张牌中的 n 张扑克牌的所有组合?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
您需要一组
N
项中的n
项的所有组合(在您的情况下,N == 52
,但我会保留回答通用)。每个组合都可以表示为项目索引数组
size_t item[n]
,这样:0 <= item[i] < N
item[i] < item[i+1]
,这样每个组合都是一个唯一的子集。从
item[i] = i
开始。然后迭代到下一个组合:item[ni])。增加该值,然后将所有以下索引重置为尽可能小的值。
item[0] == Nn
),那么您就完成了。在代码中,它可能看起来像这样(未经测试):
让它更通用,并且看起来更像
std::next_permutation
可能会更好,但这就是一般想法。You need all combinations of
n
items from a set ofN
items (in your case,N == 52
, but I'll keep the answer generic).Each combination can be represented as an array of item indexes,
size_t item[n]
, such that:0 <= item[i] < N
item[i] < item[i+1]
, so that each combination is a unique subset.Start with
item[i] = i
. Then to iterate to the next combination:item[n-1] < N-1
), then do that.item[n-i] < N-i
). Increment that, then reset all the following indexes to the smallest possible values.item[0] == N-n
), then you're done.In code, it might look something vaguely like this (untested):
It might be nice to make it more generic, and to look more like
std::next_permutation
, but that's the general idea.该组合迭代器类源自此处发布的先前答案。
我做了一些基准测试,它比您之前使用的任何 next_combination() 函数至少快 3 倍。
我在 MetaTrader mql4 中编写了代码来测试外汇三角套利交易。我认为你可以轻松地将其移植到 Java 或 C++。
输出:
This combinations iterator class is derived from the previous answers posted here.
I did some benchmarks and it is a least 3x faster than any next_combination() function you would have used before.
I wrote the code in MetaTrader mql4 to do testing of triangular arbitrage trading in forex. I think you can port it easily to Java or C++.
Output:
输出:
Output:
我发现这个问题本质上与电源设置问题相同。请参阅编写 powerset 代码时遇到的问题以获得优雅的解决方案。
I see this problem is essentially the same as the power set problem. Please see Problems with writing powerset code to get an elegant solution.