Ограничение количества символов для push-уведомлений iPhone

Я рекомендую ответить для номинанта , но если вы только генерируете это значение, чтобы вы могли его распечатать, вы можете устранить часть работы и в то же время получить более общую процедуру, используя тот же method:

char *shuffle( char *digit, int digits, int count, unsigned int seed )
{
    //optional: do some validation on digit string
    //  ASSERT(digits == strlen(digit));
    //optional: validate seed value is reasonable
    //  for(unsigned int badseed=1, x=digits, y=count; y > 0; x--, y--)
    //      badseed *= x;
    //  ASSERT(seed < badseed);

    char *work = digit;
    while(count--)
    {
        int i = seed % digits;
        seed /= digits--;
        unsigned char selectedDigit = work[i];
        work[i] = work[0];
        work[0] = selectedDigit;
        work++;
    }
    work[0] = 0;

    //seed should be zero here, else the seed contained extra information
    return digit;
}

Этот метод является деструктивным по цифрам, которые в действительности не должны быть числовыми или уникальными в этом отношении.

вы хотите, чтобы выходные значения, сгенерированные в отсортированном возрастающем порядке, немного больше работали:

char *shuffle_ordered( char *digit, int digits, int count, unsigned int seed )
{
    char *work = digit;
    int doneDigits = 0; 
    while(doneDigits < count)
    {
        int i = seed % digits;
        seed /= digits--;
        unsigned char selectedDigit = work[i];
        //move completed digits plus digits preceeding selectedDigit over one place
        memmove(digit+1,digit,doneDigits+i);
        digit[0] = selectedDigit;
        work++;
    }
    work[0] = 0;

    //seed should be zero here, else the seed contained extra information
    return digit;
}

В любом случае это называется так:

for(unsigned int seed = 0; seed < 16*15*14; ++seed)
{
    char work[] = "0123456789ABCDEF";
    printf("seed=%d -> %s\n",shuffle_ordered(work,16,3,seed));
}

Это должно распечатать упорядоченный список трехзначных шестнадцатеричных значений без дублированных цифр:

seed 0 -> 012
seed 1 -> 013
...
seed 3358 -> FEC
seed 3359 -> FED

Я не знаю, что вы на самом деле делаете с этими тщательно продуманными последовательностями цифр. Если какой-нибудь плохой инженер-инженер должен будет зайти за вами, чтобы исправить ошибку, я рекомендую упорядоченную версию, так как это способ проще для человека, чтобы преобразовать семя из / в значение последовательности.

30
задан Andrey Zverev 24 April 2012 в 10:35
поделиться