• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 688
  • Last Modified:

Random number generator in (Linux with g++)

I have just discovered an anamoly in a pece of code I wrote to rearrange a list of 1245 numbers from 1 to 1245 in a random order - even though there is no "0" in the list, the random number generator keeps giving me one. Otherwise it looks alright except that there is also a 1245 and so some number in the middle is being lost. Can anyone see a problem with this code, as I can't. I am a relatively new programmer using g++ under Linux. Thanks in advance.
Heres the code (the header files are from the main program):

#include <iostream>
#include <cmath>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

int seed, a, j, np = 1245, index;

double randomNumber, ordered[1245], ordered_store[1245], random_order[1245];

void random_number_generator()

{
  double ran;
  srand (seed);
  ran = rand();
  randomNumber = ran / RAND_MAX;
  seed++;
}

void random_sequence()

{
  double temp;
  for (a = 1; a <= np; a++)
    {
      ordered[a - 1] = a;
      ordered_store[a - 1] = a;
      random_order[a - 1] = 0;
    }
  int range = int(np);
  for (a = 0; a < np; a++)
    {
      random_number_generator();
      temp = randomNumber * range;
      index = int(temp) + 1;
      random_order[a] = ordered[index];
      for (j = index; j < np - a; j++)
        {
          ordered[j] = ordered[j + 1];
        }
      range--;
    }
}

void test_3()
{
  fstream fileout ("random_order", ios::out);
  for (a = 0; a < np; a++)
    {
      fileout << " " << random_order[a] << "   " << ordered_store[a] << endl;
    }
}

main()
{
  random_sequence();
  test_3();
  return 0;
}

0
bobhope021500
Asked:
bobhope021500
1 Solution
 
ScottyDawgCommented:
always add 1 to the result of the random number
0
 
bobhope021500Author Commented:
Edited text of question.
0
 
KangaRooCommented:
Please do not edit the text of the question, rather use comments. Changing the question text may produce strange looking comment threads. Thank you.
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.

 
nietodCommented:
You should not keep seeding the random number generator.  Just seed 1 time, at the start of the program.

the random_number_generator() function should return a random number rather than placing the result in a global varaible.  Using a global variable in this way is a very bad idea.  It can lead to many problems and can make a program hard to debug.  whenever possible, return information through a return value, or perhaps through a reference parameter, not through "invisible" means.

The line
  randomNumber = ran / RAND_MAX;

will generate a number between 0 and 1 inclusive.  (0 and 1 are possible).

Byt then you convert that number bacj to an integer.  Why not just keep it an integer?


for (a = 0; a < np; a++)
{
   index = rand() % range;
  // index is now from 0 to range -1  (is it supposed to go to range?  I'm not sure.  If so mode by range+1)
   random_order[a] = ordered[index];
}
0
 
bobhope021500Author Commented:
Thanks, that sorted it out. I included the seed incrementation in order to increase the element of randomness - I am developing neural network software which relies on the random order of the input data to emphasise the characteristics of the data rather than the way it is presented. But I'm sure this won't be a problem and if it is I may be back! Thank you.
0
 
nietodCommented:
>> I included the seed incrementation in order to
>> increase the element of randomness
But it doesn't.  You are seeding with sequential numbers, that is no more random than not reseeding.  I fact it may be far less random (It may cause sequences of repeated numbers).  Your best bet is to seed with a single psuedo-random number one time, like the current time.  Then let the sequence proceed unaltered (un-reseeded) from there.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

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