最近我一直在阅读关于乐透转动和组合生成的内容。我以为我会给它一个旋转,并查看示例代码。我设法基于一些VB拼凑了一个数字轮,但我在移植它时引入了一个有趣的错误。 http://www.xtremevbtalk.com/showthread.php?t=168296
它允许您基本上识别任何组合。你输入N个数字,K个选择和一个索引,它按字典顺序返回该组合。 它在低值时效果很好,但随着球数(N)的增加,我会得到额外的数字。 40个球,2个选秀权。 780号组合返回40和41!我添加的选择和数字越多,这就越高,它似乎发生在运行结束时前面的数字是由于周期。
我发现在VB论坛上生成可能组合数的方法没有多大意义,所以我找到了一个更简单的方法: http://www.dreamincode.net/code/snippet2334.htm 然后我发现使用双打似乎导致缺乏解决方案。使用长作品,但现在我不能使用更高的N值,因为乘法超出范围很长!然后我尝试了ulong和十进制也不会超过26-28个数字(N)。 所以我恢复到VB网站上的版本。 http://www.xtremevbtalk.com/showthread.php?s=6548354125cb4f312fc555dd0864853e&t=129902
该代码是一种避免达到96bit上限的方法,并声称能够计算高达N 98,K 49。 出于某种原因,我无法理解这一点,它会吐出一些非常奇怪的数字。
放弃一段时间后,我决定重新阅读建议的维基。虽然大部分都在我脑海中,但我发现计算二项式系数的某些方法存在不准确性。这对于您基本上拨号(转向)游戏的系统来说是不合适的。经过一番搜索和阅读后,我发现了这个: http://dmitrybrant.com/2008/04/29/binomial-coefficients-stirling-numbers-csharp
原来这正是我要找的信息!对于我正在做的任何事情,第一种方法都是准确且快速的。非常感谢psYchotic加入到这里发布的麻烦!
答案 0 :(得分:1)
在40个集合中,正好有780个2个数字的组合。如果组合生成器使用从零开始的索引,则任何索引> =最大组合量将无效。 您可以使用binomial coefficient来确定可以形成的组合数。