我需要数学意义上的所有可能组合(没有重复),其中n = 30且k = 18
function subcombi($arr, $arr_size, $count)
{
$combi_arr = array();
if ($count > 1) {
for ($i = $count - 1; $i < $arr_size; $i=$i+1) {
$highest_index_elem_arr = array($i => $arr[$i]);
foreach (subcombi($arr, $i, $count - 1) as $subcombi_arr)
{
$combi_arr[] = $subcombi_arr + $highest_index_elem_arr;
}
}
} else {
for ($i = $count - 1; $i < $arr_size; $i=$i+1) {
$combi_arr[] = array($i => $arr[$i]);
}
}
return $combi_arr;
}
function combinations($arr, $count)
{
if ( !(0 <= $count && $count <= count($arr))) {
return false;
}
return $count ? subcombi($arr, count($arr), $count) : array();
}
$numeri="01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30";
$numeri_ar=explode(".",$numeri);
$numeri_ar=array_unique($numeri_ar);
for ($combx = 2; $combx < 19; $combx++)
{
$combi_arr = combinations($numeri_ar, $combx);
}
print_r($combi_arr);
它可以工作,但它以内存不足错误终止,当然,组合数量太大。
现在我不需要完全所有的组合。我只需要其中的一小部分。 我会解释一下。
我需要这项工作来进行意大利乐透的统计研究。
我将这种格式的乐透存档保存在$archivio
数组
...
35.88.86.03.54
70.72.45.18.09
55.49.35.30.43
15.52.49.41.72
74.26.54.77.90
33.14.56.42.11
08.79.41.01.52
82.33.32.83.43
...
此处提供完整存档 https://pastebin.com/tut6kFXf
更新的提取是最重要的。
我尝试(未成功)修改函数来执行此操作
$archivio
的前30行之一中有3个数字。如果“是”,则组合不能保存在组合数组中,这种组合对我的需要没有统计价值。如果“否”,则必须将组合保存在组合数组中,这种组合对我的需求具有很大的统计价值。通过这种方式,总的组合不会超过几百或几千,我会避免记忆力不足,我会得到我需要的。
脚本时间肯定会很长,但使用上面的方法不应该没有内存。
任何人都可以帮助我吗? 谢谢