How to generate 3 no-digit repeated random integers, each with distinct digits in C

1 Answer

0 votes
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* ------------------------------------------------------------
   Function: generate_number
   Purpose: Create one integer with distinct digits, drawn from
            a shared pool of available digits. Always returns
            a 3-digit integer (leading zeros allowed).
   ------------------------------------------------------------ */
int generate_number(char *available_digits, int *available_count, int length) {
    /* First digit must not be zero */
    int i, idx;
    char first_digit;

    /* Find non-zero digits in the pool */
    int non_zero_indices[10];
    int nz_count = 0;

    for (i = 0; i < *available_count; i++) {
        if (available_digits[i] != '0') {
            non_zero_indices[nz_count++] = i;
        }
    }

    /* Choose first digit */
    idx = non_zero_indices[rand() % nz_count];
    first_digit = available_digits[idx];

    /* Remove first digit from pool */
    for (i = idx; i < *available_count - 1; i++) {
        available_digits[i] = available_digits[i + 1];
    }
    (*available_count)--;

    /* Choose remaining digits */
    char chosen[4];
    chosen[0] = first_digit;

    for (i = 1; i < length; i++) {
        idx = rand() % (*available_count);
        chosen[i] = available_digits[idx];

        /* Remove chosen digit */
        int j;
        for (j = idx; j < *available_count - 1; j++) {
            available_digits[j] = available_digits[j + 1];
        }
        (*available_count)--;
    }

    /* Convert to integer */
    int result = (chosen[0] - '0') * 100 +
                 (chosen[1] - '0') * 10 +
                 (chosen[2] - '0');

    return result;
}

/* ------------------------------------------------------------
   Function: generate_three_distinct_digit_numbers
   Purpose: Produce three integers, each with distinct digits,
            and no digit repeated across all three numbers.
            All numbers are exactly 3 digits long.
   ------------------------------------------------------------ */
void generate_three_distinct_digit_numbers(int *a, int *b, int *c) {
    char digits[10] = {'0','1','2','3','4','5','6','7','8','9'};
    int count = 10;

    *a = generate_number(digits, &count, 3);
    *b = generate_number(digits, &count, 3);
    *c = generate_number(digits, &count, 3);
}

/* ------------------------------------------------------------
   Main execution
   ------------------------------------------------------------ */
int main() {
    srand((unsigned)time(NULL));

    /* Run the generator 5 times */
    for (int i = 0; i < 5; i++) {
        int n1, n2, n3;
        generate_three_distinct_digit_numbers(&n1, &n2, &n3);
        printf("(%d, %d, %d)\n", n1, n2, n3);
    }

    return 0;
}


/*
run:

(617, 923, 480)
(746, 135, 208)
(390, 478, 561)
(582, 614, 907)
(165, 492, 780)

*/

 



answered 13 hours ago by avibootz

Related questions

...