Я рекомендую ответить для номинанта , но если вы только генерируете это значение, чтобы вы могли его распечатать, вы можете устранить часть работы и в то же время получить более общую процедуру, используя тот же 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