Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Problems with random() function

Posted on 2003-11-12
8
Medium Priority
?
3,084 Views
Last Modified: 2010-04-01
FindFilesAll function returns the list of fils in TStringList. When i use random function in on form create it generates the same number all the time when program starts. It also returns the same file all the time. How can i fix this? Any ideas?

On form create:

  TStringList *lResults = new TStringList;
  FindFilesAll("D:\\Documents", lResults);

  Randomize;
  int ii = random(lResults->Count);
  AnsiString FileName = lResults->Strings[ii];

  ShowMessage(FileName);
0
Comment
Question by:kabix
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
  • 2
  • +2
8 Comments
 
LVL 19

Expert Comment

by:Dexstar
ID: 9735975
kabix:

>   Randomize;

This is not a proper C++ function call.  It should be:
     Randomize();


Hope that helps,
Dex*
0
 
LVL 18

Accepted Solution

by:
bobbit31 earned 60 total points
ID: 9735980
shouldn't you be calling

// generate random seed
   randomize();

instead of Randomize; ??
0
 
LVL 3

Expert Comment

by:Kashra
ID: 9736435
Maybe I'm missing something important, but I thought C++ did random numbers a little differently. First of all, the problem you're describing sounds like a seed problem. Random number generators aren't random, they're algorithmic and start with a seed value (usually the current time). Each seed value should give a seemingly "random" number, but the same seed value will give the same random number each time.

Now, when I do random numbers in C++, I usually use the following:
srand(unsigned int seed); // this function seeds the random number generator
  // you only need to seed the generator once.
int rand(); // this function generates a random number between 0 and RAND_MAX

Anyway, you might already know all this, but if you don't, then it might help. Good luck!
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 23

Expert Comment

by:brettmjohnson
ID: 9736977
random() will create the same series of random numbers on each execution
unless you seed the random number generator with a different seed each time.
I usually seed the random number generator with the current time:

srandom(time(NULL));

...

long num = random();

BTW, Kashra's example uses rand(), which is discouraged.  random() supercedes rand()
using a much better random number generator.

NAME
     rand, srand, sranddev, rand_r - bad random number generator
....

DESCRIPTION
     These interfaces are obsoleted by random(3).



NAME
     random, srandom, srandomdev, initstate, setstate - better random number
     generator; routines for changing generators

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <stdlib.h>

....

0
 
LVL 3

Expert Comment

by:Kashra
ID: 9737092
While I'm no expert on ANSI standards, I'm pretty sure random() and srandom() are not a part of the standard library. They certainly don't exist in any standard reference I have. They might exist on some platforms, or they might have been added recently.

They also don't exist in Visual C++ .NET. While I know that its not the most standards compliant compiler, it comes pretty close these days. I'd be happy to be corrected if I'm wrong.

I'd find it surprising if the functions that are replacing rand and srand don't behave similarly. rand() only needs to be seeded once.
0
 
LVL 19

Expert Comment

by:Dexstar
ID: 9740994
Guys,

He is obviously using some other library.  TStringList, AnsiString, and ShowMessage aren't part of the standard library, either.
The problem is like I said before...

     > This is not a proper C++ function call.  It should be:
          Randomize();

Without the parens, the compiler is ignoring this function call (I'd be surprised if you didn't at least get a warning), which is causing the random number generator to not be seeded properly, which is causing the same "random" value to come up each time.

Dex*

0
 
LVL 18

Expert Comment

by:bobbit31
ID: 9741365
TStringList, AnsiString,ShowMessage are in Borland C++ Builder... in whiich case i believe you call:

randomize();

at least it works for me ;)
0
 
LVL 9

Expert Comment

by:tinchos
ID: 10249093
No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Accept: brettmjohnson {http:#9736977}

Please leave any comments here within the next seven days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

Tinchos
EE Cleanup Volunteer
0

Featured Post

[Webinar] Lessons on Recovering from Petya

Skyport is working hard to help customers recover from recent attacks, like the Petya worm. This work has brought to light some important lessons. New malware attacks like this can take down your entire environment. Learn from others mistakes on how to prevent Petya like worms.

Question has a verified solution.

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

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

610 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