均匀地表示组合子集中的所有数字

时间:2013-01-23 15:39:17

标签: php math combinations

我想找出什么是最有效的PHP脚本来均匀地表示特定组合子集中的所有数字。

彩票问题示例:

  • 创建 10 组合,每个组合包含 6 数字
  • 来自数字(1,2,3,4,5,6,7,8,9,10,11,12)

我知道从12个数字中我可以创建 924 组合,每个组合包含6个数字。

由于我买不起924行 - 我只想挑选10行代表所有选定数字的行。

所以在这个例子中它将是:

  • 1-2-3-4-5-6
  • 7-8-9-10-11-12

    和另外8行

我试图避免像:

这样的组合
  • 1-2-3-4-5-6
  • 1-2-3-4-5-7
  • 1-2-3-4-5-8

......等几乎相同;我想平均代表每个数字。

希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

您可以创建要使用的数字的“池”,并从该池中随机抽取。例如,如果您想要10个组合,每组6个数字,那么总共有60个数字。但是你希望1-12中的每一个均匀表示,因此每个数字将有5个。所以从包含每个1-12中的5个的数组开始,并从数组中随机抽取每组6个。

$pool = array();
for($i = 0; $i < 5; $i++)
    for($x = 1; $x <= 12; $x++)
        $pool[] = $x;

$result = array();
for($i = 0; $i < 10; $i++) {
    $set = array();
    for($x = 0; $x < 6; $x++) {
        $key = array_rand($pool);
        $set[] = $pool[$key];
        unset($pool[$key]);
    }
    $result[] = $set;
}

// $result now contains 10 sets of 6 numbers each

演示:http://ideone.com/NpO3h4

答案 1 :(得分:0)

// how many numbers are in the set, starting from 1
$numbers = 12;
$set = array();
for ($i=1;$i>=$numbers;$i++)
{
    array_push($set, $i);
}

// how many numbers in the subset
$count = 6;
$subSet = array();
while ($count > 0)
{
    // get a random number from 1 to numbers in set
    $rand=rand(0,$numbers-1);
    array_push($subSet, $set[$rand]);
    $count--;
}

// $subSet now contains a combination of 6 random numbers from 1 to 12
// keep refreshing
var_dump($subSet);

你去解释,这是你想要的吗?

编辑:我刚注意到你说“最有效的方式”。这不是最有效的(就使用的内存而言)方式,但它很接近。