Solved

Unique, random 4 digit numbers

Posted on 2003-10-27
8
720 Views
Last Modified: 2010-04-15
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
Comment
Question by:Tabris42
  • 5
  • 2
8 Comments
 
LVL 1

Accepted Solution

by:
guitardude101 earned 250 total points
ID: 9631430
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
 
LVL 1

Expert Comment

by:guitardude101
ID: 9631446
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
 
LVL 30

Expert Comment

by:Axter
ID: 9631528
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
 
LVL 6

Expert Comment

by:Ajar
ID: 9631559
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
What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 1

Expert Comment

by:guitardude101
ID: 9631597
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
 
LVL 1

Expert Comment

by:guitardude101
ID: 9631609
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
 
LVL 30

Expert Comment

by:Axter
ID: 9632757
>>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
 
LVL 1

Expert Comment

by:guitardude101
ID: 9633029
yep
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Suggested Solutions

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.

759 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

24 Experts available now in Live!

Get 1:1 Help Now