Solved

Random number generator in (Linux with g++)

Posted on 2000-02-18
6
645 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
Comment Utility
always add 1 to the result of the random number
0
 

Author Comment

by:bobhope021500
Comment Utility
Edited text of question.
0
 
LVL 7

Expert Comment

by:KangaRoo
Comment Utility
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
Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

 
LVL 22

Accepted Solution

by:
nietod earned 100 total points
Comment Utility
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
Comment Utility
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
Comment Utility
>> 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

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

  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 …
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
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 how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

728 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

10 Experts available now in Live!

Get 1:1 Help Now