954,480 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

problem in generating non repeated random numbers

i want to generate non repeated random numbers from 0 to 156. here is the code for the purpose. but when i try to generate the random numbers more then 1 time by using a for loop, the same pattern on numbers repeats. how to solve this problem ?

#include "sys/types.h"
#include "stdio.h"
#include "time.h"
#define MAX 2000
#define N 156
main( )
{
int array[BIG_SIZE],r;
int n = 0; int count_check,count_gen ,i;
time_t t1;
(void) time(&t1);
srand48((long) t1);
for (count_gen=0;count_gen<=MAX;count_gen++)
{
r = lrand48()%N;
for ( count_check = 0; count_check < n; count_check++ )
{
if ( r == array[count_check] )break;
}
if ( count_check == n ) array[n++] = r;
}
for(i=0;i

xshashiy
Newbie Poster
4 posts since Jul 2005
Reputation Points: 10
Solved Threads: 0
 

You are using time for purposes of generating the random number, but only once before the loop. You should probably reset the time each part of the loop.

(void) time(&t1);

(Though you may continue to have the same problem as I think time only holds seconds... )

Also, what you posted won't compile - BIG_SIZE is not defined, etc.

winbatch
Posting Pro in Training
466 posts since Feb 2005
Reputation Points: 68
Solved Threads: 18
 

Since you already know the range of the sequence, and it's small, and you want non-repeating values, a random shuffle would be a better option than trying to check whether each new number was already generated or not:

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

#define N 157

int main ( void )
{
  int seq[N];
  int i;

  srand ( (unsigned)time ( NULL ) );

  /* Initialize seq to an ordered range */
  for ( i = 0; i < N; i++ )
    seq[i] = i;

  /* Random shuffle */
  for ( i = 0; i < N - 1; i++ ) {
    int r = ( rand() % ( N - i ) + 1 );
    int save = seq[i];
    seq[i] = seq[i + r];
    seq[i + r] = save;
  }

  /* Test the sequence */
  for ( i = 0; i < N; i++ )
    printf ( "%d ", seq[i] );

  return 0;
}

Not only is it easier to verify, it's also considerably faster.

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

Sometimes the standard library makes life easier:

#include <algorithm>
/* Random shuffle */
std::random_shuffle(seq, seq + N);


Obviously not useful since we already have an implementation, but useful if you'll need it elsewhere.

Rashakil Fol
Super Senior Demiposter
Team Colleague
2,658 posts since Jun 2005
Reputation Points: 1,135
Solved Threads: 177
 

>Sometimes the standard library makes life easier
Indeed. But since the original problem was clearly written in C, the C++ standard library is hardly useful. You might argue that C compiles as C++, so it's not a problem, but since you would be wrong, I recommend that you don't bother, and save yourself the intellectual manbeating I'll give you if you try. :D

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

Oh man, what was I thinking?

Never mind then. :o

(It's not a question of whether C can compile to C++; C++ simply can't be compiled as C! ;-) )

Rashakil Fol
Super Senior Demiposter
Team Colleague
2,658 posts since Jun 2005
Reputation Points: 1,135
Solved Threads: 177
 

Oh man you rock. I'm a noob, and getting lost in following how the random shuffle for loop works...was wondering if you could explain line by line?

Since you already know the range of the sequence, and it's small, and you want non-repeating values, a random shuffle would be a better option than trying to check whether each new number was already generated or not:

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

#define N 157

int main ( void )
{
  int seq[N];
  int i;

  srand ( (unsigned)time ( NULL ) );

  /* Initialize seq to an ordered range */
  for ( i = 0; i < N; i++ )
    seq[i] = i;

  /* Random shuffle */
  for ( i = 0; i < N - 1; i++ ) {
    int r = ( rand() % ( N - i ) + 1 );
    int save = seq[i];
    seq[i] = seq[i + r];
    seq[i + r] = save;
  }

  /* Test the sequence */
  for ( i = 0; i < N; i++ )
    printf ( "%d ", seq[i] );

  return 0;
}

Not only is it easier to verify, it's also considerably faster.

DKdontKNO
Newbie Poster
1 post since Sep 2010
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You