Articles   Members Online:
-Article/Tip Search
-News Group Search over 21 Million news group articles.
Member Area
-Account Center
-Top 10 NEW!!
-Submit Article/Tip
-Forums Upgraded!!
-My Articles
-Edit Information
-Become a Member
-Why sign up!
-Chat Online!
-Indexes NEW!!
-Build your resume
-Find a job
-Post a job
-Resume Search
-Link to us
Visit Embarcadero
Embarcadero Community
How to check for duplicates in a dynamic array of elements containing random int Turn on/off line numbers in source code. Switch to Orginial background IDE or DSP color Comment or reply to this aritlce/tip for discussion. Bookmark this article to my favorite article(s). Print this article
Delphi 2.x
User Rating
No Votes
# Votes
DSP, Administrator
Reference URL:
			Author: Jonas Bilinkevicius

Say I have a dynamic array of five elements containing random integers. I want to 
be able to check for duplicate numbers among the 5 elements and if found, call a 
random number generator function until all the numbers are different.


Solve 1:

This strategy goes through the array one element at a time, making sure it is 
unique. All we have to do is make sure it is unique from all the preceding 
elements, and by the time you get to the end of the array, it is all unique.

1   procedure ForceUnique;
2   var
3     i, j: integer;
4   begin
5     for i := 2 to 5 do {the first element is unique by definition}
6     begin
7       j := 1;
8       while (j < i) do
9       begin
10        if MyArray[j] = MyArray[i] then
11        begin
12          MyArray[i] := Random(MyRange);
13          j := 1; {start over with a new number}
14        end
15        else
16          j := j + 1;
17      end;
18    end;
19  end;

Watch out for potential infinite loop problem if the range of random numbers is 
less than the size
of the array.

Solve 2:

How about filling the arrays with ascending order of number and then shuffling it 
randomly afterwards. This is the quickest and surest way to achieve the same effect.

What I am afraid is a situation like this. Let us say you have an array of 32767 
small integers. Let us say you want to fill the individual elements with Random 
values ranging from 0 to 32767. Using random number generator, the probability that 
all of the elements will be unique is zero. Now, let us say, you sort the random 
list first, then it is easy to find duplicates, and let us say for each duplicate 
you try to generate a random number which is not in the array and hopefully replace 
those duplicates. In this situation, your program will take forever to complete.

If you only have 5 elements, a bubble-type comparison would suffice, if you have 
more than a hundred elements, you need to sort your array first and do a binary 
search to find duplicates. If your random number ranges from 0 to MaxInt, this has 
a greater chance of successfully completing than with a smaller random number range.

Here's the slowest but easy to understand working code for bubble-wise comparisons. 
Assume iArray is your dynamic array 1 based.

20  {declare these first:
21  i, j, k, iRand, iCurr: integer;
22  iAlreadyExists: boolean;}
24  { ... }
25  for i := 1 to 5 do
26  begin
27    icurr := iArray[i];
28    for j := i + 1 to 5 do
29    begin
30      if icurr = iArray[j] then
31      begin
32        repeat
33          irand := Random(MaxInt);
34          iAlreadyExists := False;
35          for k := 1 to 5 do
36          begin
37            if irand = iArray[k] then
38            begin
39              iAlreadyExists := True;
40              break;
41            end;
42          end;
43        until
44          not iAlreadyExists;
45        iArray[i] := irand;
46        break;
47      end;
48    end;
49  end;
50  { ... }

Vote: How useful do you find this Article/Tip?
Bad Excellent
1 2 3 4 5 6 7 8 9 10


Share this page
Download from Google

Copyright © Mendozi Enterprises LLC