Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 743
  • Last Modified:

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.
0
Tabris42
Asked:
Tabris42
  • 5
  • 2
1 Solution
 
guitardude101Commented:
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);
      }
}
0
 
guitardude101Commented:
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;
0
 
AxterCommented:
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;
}

0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
AjarCommented:
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}}
           }
     }
     
}
0
 
guitardude101Commented:
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.
0
 
guitardude101Commented:
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.
0
 
AxterCommented:
>>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.......


0
 
guitardude101Commented:
yep
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 5
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now