之前做过的彩票项目中用到了排列和组合公式,分享给需要的人。
/** * 排列结果 包括重复内容 */ arrCPermute: function (arr, num) { var r = []; (function f(t, a, n) { if (n == 0) return r.push(t); for (var i = 0, l = a.length - n; i <= l; i++) { f(t.concat(a[i]), a.slice(i + 1), n - 1); } })([], arr, num); return r; }, /** * 排列结果 不包括重复内容 */ arrCPermute1: function (arr, num) { var r = []; (function f(t, a, n) { if (n == 0) return r.push(t); for (var i = 0, l = a.length; i < l; i++) { f(t.concat(a[i]), a.slice(0, i).concat(a.slice(i + 1)), n - 1); } })([], arr, num); return r; }, /** * 排列公式(从n个不同元素中取出m个元素的组合数) * @param n * @param m * @returns {number} */ mathP: function (n, m) { var c = 1; for (var i = n - m; i < n; c *= ++i); return c; }, /** * 组合公式(从n个不同元素中取出m个元素的组合数) * @param n * @param m * @returns {number} */ mathC: function (n, m) { var n1 = 1, n2 = 1; for (var i = n, j = 1; j <= m; n1 *= i--, n2 *= j++); return n1 / n2; },
双色球计算组合时可以这样使用
lotNum = util.mathC(redNum, 5) * util.mathC(blueNum, 2); //红球的组合*篮球的组合