Обзор кода для генерации комбинаций чисел - PullRequest
1 голос
/ 10 ноября 2011

Может кто-нибудь показать мне, как я могу генерировать все возможные комбинации чисел? Например, если у меня есть это arrayOfNumbers = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;

Мне нужно сгенерировать как можно больше шестизначных комбинаций.

Эти комбинации одинаковы для меня 1,2,3,4,5,6 == 1,3,2,5,4,6;

Я придумал довольно простой код, но я хотел бы сделать этот код намного лучше. Могу ли я сделать это как-то без объявления maximumPossibilities? Общее количество может быть разным в разы, оно может быть от 1 до 48; И countOfNumbersForPlay может быть разным, от 6 до 11;

+ (NSArray *)generateNumbers{

    int MAX_POSSIBILITIES = 7;
    int COUNT_OF_NUMS_FOR_PLAY = 6;

    NSMutableArray *results = [NSMutableArray array]; 

    NSArray *numbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], [NSNumber numberWithInt:4], [NSNumber numberWithInt:5], [NSNumber numberWithInt:6], [NSNumber numberWithInt:7], nil];

    int i = 0;
    do {

        int x = 0;

        NSMutableArray *temp = [NSMutableArray array];

        do {

            int randomIndex = rand() % numbers.count;

            if (![temp containsObject:[numbers objectAtIndex:randomIndex]]) {
                [temp addObject:[numbers objectAtIndex:randomIndex]];
                x++;
            }

        } while (x < COUNT_OF_NUMS_FOR_PLAY);

        NSArray *sortedArray = [temp sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            if ([obj1 intValue] < [obj2 intValue]) {
                return NSOrderedAscending;
            } else if ([obj1 intValue] > [obj2 intValue]) {
                return NSOrderedDescending;
            } else {
                return NSOrderedSame;
            }
        }];


        if (![results containsObject:sortedArray]) {
            [results addObject:sortedArray];
            i++;
        }

    } while (i < MAX_POSSIBILITIES);    

    return results;
}

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

Хотя Даниэль дает подобное решение выше, я бы хотел сформулировать это так, потому что именно так я концептуально рассматриваю проблему такого рода.

Предположим, у вас есть «алфавит» символов, называемый alpha, скажем, альфа = {1,2,3,4,5,6} для этого примера. Длина алфавита в этом случае составляет 6.

Вы понимаете, что у вас будет 6 ^ k действительных чисел k-длины с этим алфавитом. Благодаря тому, что вы гарантируете, что все персонажи уникальны, только на самом деле можно проверить

Обычно для всех i в [0..6 ^ k] просто конвертируйте i в основание в 6. Если у вас был нецифровый алфавит, теперь вы можете перевести каждый символ в индекс алфавита.

0 голосов
/ 11 ноября 2011

Если вы просто посчитаете от 012345 до 456789, вы пройдете все возможные комбинации для цифр 0..9.И любое число, где более ранняя цифра равна или больше, чем более поздняя цифра (например, 103456), оно уже «покрыто», учитывая ваши правила, так что вы можете перейти, например, с 200000 в вашем счете до 234567.

Оттуда довольно просто обобщить произвольные "цифры".Создайте массив для хранения ваших «цифр».Каждый элемент массива представляет собой одну «цифру».Затем вам нужно реализовать правило приращения (так же, как обычную арифметику), что, когда цифра увеличивается за пределы ее верхней границы, она сбрасывается до ее нижней границы, и «перенос» вызывает увеличение следующей цифры более высокого порядка.Но обратите внимание, что когда вы увеличиваете таким образом, новое значение текущей цифры неизбежно будет меньше, чем цифра, которую вы только что увеличили влево (если только она также не была увеличена до ее верхней границы), поэтому вы должны установить текущее значение.цифра до значения цифры слева + 1 и установка цифр справа для увеличения значений после текущей цифры.

Результатом каждого приращения является одно из генерируемых значений.

...