你的位置: 真人龙虎游戏 > 博彩问答 >

排列组合数的产生

发布日期:2022-03-02 17:46    点击次数:165

排列组合数的产生

最近在写一个小项目,计算极大似然估计的时候,需要生成一些组合数,就是说给定一列数字,比如(1,1,2,3,1),产生这些数字的不重复的排列组合:
(1 1 1 2 3)
(1 1 2 3 1)
(1 2 3 1 1)
(2 3 1 1 1)
(1 1 2 1 3)
(1 2 1 3 1)
(2 1 3 1 1)
(1 2 1 1 3)
(2 1 1 3 1)
(2 1 1 1 3)
(1 1 1 3 2)
(1 1 3 2 1)
(1 3 2 1 1)
(3 2 1 1 1)
(1 1 3 1 2)
(1 3 1 2 1)
(3 1 2 1 1)
(1 3 1 1 2)
(3 1 1 2 1)
(3 1 1 1 2)
应该有
种。一开始我在matlab里面写,最自然的想法就是,直接用matlab的命令,产生排列组合数,然后把重复的去掉:
unique(perms([1 1 2 2 3]),'rows') 结果因为我的规模比较大,大约70个数字的向量,假如有
个1,
个2...那么全部存储下来,有
。我用这个命令计算,Matlab直接告诉我,超过最大行数。。。
但是博彩问答实际上,我最终的计算结果,只要针对每一种可能的排列组合计算一个数,然后加总就可以了。

想了好久没想到什么好的办法。想了一下可以用递归,但是还是没解决空间的问题。求救于万能的知乎,立马就有人给了我靠谱的答案:请教产生排列组合的算法?
当然,最靠谱的答案不在答案里,在题目的评论里。按照他给的算法名字我去google,果真查到了可行的算法:http://nayuki.eigenstate.org/page/next-lexicographical-permutation-algorithm,而且连现成的C代码都有了。
既然这样,问题就解决了:
#include <stddef.h> #include <stdio.h> #include <gsl/gsl_sort_int.h> int next_permutation(int *array, size_t length) { size_t i, j; int temp; // Find non-increasing suffix if (length == 0) return 0; i = length - 1; while (i > 0 && array[i - 1] >= array[i]) i--; if (i == 0) return 0; // Find successor to pivot j = length - 1; while (array[j] <= array[i - 1]) j--; temp = array[i - 1]; array[i - 1] = array[j]; array[j] = temp; // Reverse suffix j = length - 1; while (i < j) { temp = array[i]; array[i] = array[j]; array[j] = temp; i++; j--; } return 1; } void main(){ int a[]={1,1,2,2,3}; int i; gsl_sort(a,0,5); do{ printf("("); for (i=0;i<5;++i){ printf("%d,",*(a+i)); } printf(")\n"); }while (next_permutation(a,5)); } Ok,极大似然的目标函数就可以用C重写了,既解决了空间的问题,也同时解决了这个似然函数循环太多太慢的问题。

但是,如果说到线上玩二人麻将的话,那就不得不提到关于二人麻将游戏下载的问题了。要是让小编选择哪里的二人麻将游戏下载的话,小编一定会选择同城游的。当然了,选择同城游的话,肯定是因为这个游戏平台的特殊之处。

记牌对于麻将的玩家,是并不需要太刻意就能做到的事情,而二人麻将游戏下载之后,出去的牌在桌上显示,所以不用考虑,只是一定要记住对手打牌的方向,套取有用信息,分析好对手需要的牌,不放炮,能存就存,不能存就早放 ,这样就可以掌握了主动权。比如对手打了三万和五万,那么他需要的可能就是五万以上的牌,如果快要胡牌的时候,这五万以上的大万字,就不能放手了。风牌与花牌好控制,对方坚持不打博彩问答,就要注意要出大牌。




相关资讯