Solved

Random number generator in (Linux with g++)

Posted on 2000-02-18
6
655 Views
Last Modified: 2006-11-17
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
Comment
Question by:bobhope021500
6 Comments
 
LVL 1

Expert Comment

by:ScottyDawg
ID: 2534493
always add 1 to the result of the random number
0
 

Author Comment

by:bobhope021500
ID: 2534494
Edited text of question.
0
 
LVL 7

Expert Comment

by:KangaRoo
ID: 2534521
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
VMware Disaster Recovery and Data Protection

In this expert guide, you’ll learn about the components of a Modern Data Center. You will use cases for the value-added capabilities of Veeam®, including combining backup and replication for VMware disaster recovery and using replication for data center migration.

 
LVL 22

Accepted Solution

by:
nietod earned 100 total points
ID: 2534545
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
 

Author Comment

by:bobhope021500
ID: 2534605
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
 
LVL 22

Expert Comment

by:nietod
ID: 2534974
>> 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

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How to programmatically differentiate between C and Java 10 200
Socket Programming (Unix) 8 130
is twain_32.dll cmpatible with windows 10 ? 10 164
Header of docx file 17 103
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

831 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