下面是簡單的代碼,應該運行相當快,做你所描述的。
$numbers = range(1, 99); // numbers to pick from
$length = 5; // amount of items in the set
$sets_amount = 15; // amount of sets you want to generate
shuffle($numbers); // randomize
function get_set($length, &$numbers) {
return array_splice($numbers, 0, $length);
}
for ($i = 0; $i < $sets_amount; $i++)
print_r(get_set($length, $numbers));
注意:它只適用於當你需要幾個組合。你沒有說你想要所有可能的,所以我想如果你只需要一堆他們 - 這是非常快速和簡單的方法來做到這一點。
對於慢一點(您生成越多 - 越慢),但生成任何集的數量,您可以使用此代碼。
$numbers = range(1, 99); // numbers to pick from
$length = 5; // amount of items in the set
$sets_amount = 200; // amount of sets you want to generate
$existing = array(); // where we store existing sets
$shuffle_period = count($numbers) - $length - 1; // how often we re-randomize the elements
$j = 0;
for ($i = 0; $i < $sets_amount; $i++, $j++) {
if (!($i % $shuffle_period)) {
shuffle($numbers); // randomize at first go and on $shuffle_period
$j = 0;
}
do {
$arr = array_slice($numbers, $j, $length);
} while (in_array($arr, $existing));
$existing[] = $arr;
}
print_r($existing);
搜索費雪耶茨洗牌。 – 2012-02-04 02:25:40
你知道你需要做多少內存嗎?來自199的5個獨特組合有71,523,144個。爲什麼你實際上需要知道每種可能的組合?幾乎肯定有更好的選擇,可以將它們全部用完......也許只是按照需要生成儘可能多的混搭版本,這肯定比71,523,144少得多。的 – 2012-02-04 11:31:21
可能重複[如何降低循環速度(http://stackoverflow.com/questions/3109887/how-to-reduce-for-loop-speed) – 2012-02-04 11:41:49