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

1 Answer

0 votes
program DistinctDigitGenerator;

{$mode objfpc}

// ------------------------------------------------------------
// 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).
// ------------------------------------------------------------
function generate_number(var available_digits: array of char; var available_count: integer; length: integer): integer;
var
  i, idx, nz_count: integer;
  non_zero_indices: array[0..9] of integer;
  first_digit: char;
  chosen: array[0..2] of char;
begin
  // Find non-zero digits in the pool
  nz_count := 0;
  for i := 0 to available_count - 1 do
    if available_digits[i] <> '0' then
    begin
      non_zero_indices[nz_count] := i;
      Inc(nz_count);
    end;

  // Choose first digit
  idx := non_zero_indices[Random(nz_count)];
  first_digit := available_digits[idx];

  // Remove first digit from pool
  for i := idx to available_count - 2 do
    available_digits[i] := available_digits[i + 1];
  Dec(available_count);

  // Choose remaining digits
  chosen[0] := first_digit;

  for i := 1 to length - 1 do
  begin
    idx := Random(available_count);
    chosen[i] := available_digits[idx];

    // Remove chosen digit
    for nz_count := idx to available_count - 2 do
      available_digits[nz_count] := available_digits[nz_count + 1];
    Dec(available_count);
  end;

  // Convert to integer
  Result :=
    (Ord(chosen[0]) - Ord('0')) * 100 +
    (Ord(chosen[1]) - Ord('0')) * 10 +
    (Ord(chosen[2]) - Ord('0'));
end;


// ------------------------------------------------------------
// 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.
// ------------------------------------------------------------
procedure generate_three_distinct_digit_numbers(var a, b, c: integer);
var
  digits: array[0..9] of char = ('0','1','2','3','4','5','6','7','8','9');
  count: integer;
begin
  count := 10;

  a := generate_number(digits, count, 3);
  b := generate_number(digits, count, 3);
  c := generate_number(digits, count, 3);
end;


// ------------------------------------------------------------
// Main execution
// ------------------------------------------------------------
var
  i: integer;
  n1, n2, n3: integer;
begin
  Randomize;

  // Run the generator 5 times
  for i := 1 to 5 do
  begin
    generate_three_distinct_digit_numbers(n1, n2, n3);
    WriteLn('(', n1, ', ', n2, ', ', n3, ')');
  end;
end.


(*
run:

(970, 451, 286)
(561, 984, 703)
(893, 267, 510)
(284, 509, 316)
(129, 675, 803)

*)

 



answered 13 hours ago by avibootz

Related questions

...