2

我想找出什么是最有效的 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

...等几乎相同;我想均匀地表示每个数字。

希望这是有道理的。

4

2 回答 2

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

于 2013-01-23T15:46:23.283 回答
0
// 集合中有多少个数字,从 1 开始
$数字 = 12;
$set = 数组();
对于 ($i=1;$i>=$numbers;$i++)
{
    array_push($set, $i);
}

// 子集中有多少个数字
$计数 = 6;
$subSet = 数组();
而 ($count > 0)
{
    // 获取一个从 1 到集合中的数字的随机数
    $rand=rand(0,$numbers-1);
    array_push($subSet, $set[$rand]);
    $count--;
}

// $subSet 现在包含从 1 到 12 的 6 个随机数的组合
// 保持刷新
var_dump($subSet);

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

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

于 2013-01-23T15:54:29.057 回答