Если вы ищете целое с n
цифрами нарисованного от 0 до 9, без повторов (ваш вопрос трудно интерпретировать), то следующий будет достаточно.
Идея состоит в том, чтобы поместить все цифры от 0 до 9 в шляпе, а затем вывести их один за другим. Приложите все к произвольному целочисленному значению, которое вы строите.
Шляпа - это массив, изначально заданный 0 до 9.
Чтобы нарисовать номер, когда в шляпе есть k
элементов в нем, вычислите случайный индекс j
в диапазоне [0..k-1]
и получите этот элемент из массива. Затем скопируйте последний (k-1
-й) элемент до позиции j
, который «стирает» его. Остальные незаблокированные цифры теперь находятся в [0..k-2], и вы можете повторить этот процесс до завершения.
присоединяя значного цифро целое значение такое же, как говорят
val = 10 * val + d
Подставив эти идеи вместе, вы следующие. Обратите внимание, что это позволяет 0 в первой позиции, поэтому на самом деле результат может иметь не более n цифр при печати без начальных нулей.
unsigned random_unrepeated_digits(int n) {
int i, digits[] = { 0,1,2,3,4,5,6,7,8,9 };
unsigned val = 0;
for (i = 0; i < n; i++) {
int k = 10 - i, j = rand() % k;
val = 10 * val + digits[j];
digits[j] = digits[k - 1];
}
return val;
}
Почему не просто случайным образом каждый из десяти цифр? – Dmitri
Но как я могу исключить предыдущие цифры, например, в лотерею. – Simona
Вы сказали «максимальные цифры», но в вашем примере кода вы подразумеваете, что ответ должен быть от 1 до макс. Что он? Может ли _all_ цифры находиться в диапазоне от 0 до 9? Вы хотите, чтобы ваш результат был как строка или 'unsigned' или что-то еще? – Gene