• C

# Unique, random 4 digit numbers

I'm looking for a good method of creating 300 unique 4 digit random numbers. However, I'm unsure of how I can actually create these numbers (between 1000 and 9999), especially making them unique. Any help that can be offered is greatly appreciated.
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
the secret to make sure they are unique is to use some type of hash table
in this example I allocate an array and use the subscript to see if I did that number yet. If I did not I mark the number taken by putting a 1 in it.

my random number functions parameters
randomnummber array to store the generated numbers
size is the number of elements
low is lowest number to generate
high is the highest number to generate

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv);
void createrandomnumbers(int randomnummber_array[], int size, int low, int high);

int main(int argc, char **argv)
{
int randomnumbers[300];
createrandomnumbers(randomnumbers, 300, 1000, 9999);

return 0;
}

void createrandomnumbers(int randomnummber_array[], int size, int low, int high)
{
int index;
int randomnumber;
int *hashtable;
size_t bytestoallocate;

bytestoallocate = ((high - low) + 1) * sizeof (int);
hashtable = (int*) malloc(bytestoallocate);
if (hashtable)
{
memset(hashtable, 0, bytestoallocate);

for (index = 0; index < size; index++)
{
while (1) {
randomnumber = (rand() % (high -low)) + low;
if (hashtable[randomnumber] == 0)
{
randomnummber_array[index] = randomnumber;
hashtable[randomnumber] = 1;
break;
}
}
}
free(hashtable);
}
}

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Commented:
I just noticed 1 thing
the line
if (hashtable[randomnumber] == 0)
should be
if (hashtable[randomnumber - low] == 0)

and
the line
hashtable[randomnumber] = 1;
should be
hashtable[randomnumber - low] = 1;
Commented:
Just use srand with a time function.
Example code:

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

int main(int argc, char* argv[])
{
int low = 1000, high= 9999, i;
int randomnumbers[3000];
srand( (unsigned)time( NULL ) );

for(i = 0;i < sizeof(randomnumbers)/sizeof(int);++i)
{
randomnumbers[i] = (rand() % (high -low)) + low;

}

for(i = 0;i < sizeof(randomnumbers)/sizeof(int);++i)
{
printf("%i, ", randomnumbers[i]);

}

printf("\n\n");

system("pause");
return 0;
}

Commented:
The following function tries to accomplish the  desired result in a intutive way.

void f()
{
int r_numbers[300],i,j,flag;
for(i=0;i <300;i++)
{
flag = 1;
while(flag)
{
flag = 0;
r_numbers[i]= 1000 + (rand()%(9999-1000);
for(j = 0; j < i;j++) {if(r_numbers[i]==r_numbers[j]) {flag = 1;break}}
}
}

}
Commented:
That would work but mine is orderes of magnitude faster and why post after a correct answer
srand will not insure you get unique numbers. It just changes the seed value.
Commented:
The reason why mine if faster is I only search 1 element to see if the number was already done.
Yours searches all previous numbers.
Commented:
>>srand will not insure you get unique numbers.

You're right.  I did not completely understand the question when I first read it.

However, your example should have a call to srand().
Otherwise, you'll get the same results everytime you run the program.

void createrandomnumbers(int randomnummber_array[], int size, int low, int high)
{
srand( (unsigned)time( NULL ) );
// The rest of your code.......

Commented:
yep
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.