Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 259
  • Last Modified:

RANDOM(x): the SAME in ALL computers ?

will

Randomseed:= 10;
a:= random(whatever)

be the same in all computers ?
I use randseed/random to encript/decript data.. and so I need to be sure that random will give me the same numbers in every computer.

bryan
0
bryan7
Asked:
bryan7
  • 5
  • 4
  • 3
  • +6
1 Solution
 
topkapiCommented:
i don't think there's a guarentee for that.
0
 
rwilson032697Commented:
If you use randseed to initialise the random() function, you will get the same sequence of numbers on every computer.

There is a caveat: Borland can change the implementation of the random() function so that the sequence of numbers generated by an app compiled with D4 may not be the same as that generated by D5.

Cheers,

Raymond.
0
 
DrDelphiCommented:
I am sure that it will not. Random uses the system's clock to generate it's result. Obviously every system is not going to have the same processor or clock speed.
The Delphi help file only mentions differences between compiler versions, but I am sure that this hold true for different systems as well:



Because the implementation of the Random function may change between compiler versions, we do not recommend using Random for encryption or other purposes that require reproducible sequences of pseudo-random numbers.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
rwilson032697Commented:
DrDelphi: Perhaps you should read the help for randseed...

Cheers,

Raymond.
0
 
bryan7Author Commented:
well, I've tested the program in a few computers and it worked in all, I mean, I got the same seq. of numbers. but I also saw in delphi help something about non-reliability on it.. differences between compiler versions is not any problem.. I just want to be sure that for any circumstances the generated numbers will be different than expected..  I haven't got any problems with it until now.. but I wanted to be sure and hear all your oppinions..

bryan
0
 
bryan7Author Commented:
typos.. "the generated numbers will be
                    different than expected..  " meant "will NOT be diff. "
0
 
edeyCommented:
I'm afraid using random just isn't reliable.  You would be far better off to write your own random number generator (or reaserch someone else's, lord knows there are enough of 'em :)


GL
Mike
0
 
MoonCalfCommented:
Dr Delphi - Random does *NOT* use the clock to produce random numbers.  It's a psuedo-random number created in relativity to the previous random number.  Raymond is right.  You are not.

MoonCalf
0
 
MoonCalfCommented:
Dr Delphi - Random does *NOT* use the clock to produce random numbers.  It's a psuedo-random number created in relativity to the previous random number.  Raymond is right.  You are not.

MoonCalf
0
 
MoonCalfCommented:
Dr Delphi - Random does *NOT* use the clock to produce random numbers.  It's a psuedo-random number created in relativity to the previous random number.  Raymond is right.  You are not.

MoonCalf
0
 
bryan7Author Commented:
so.. should I confide or not in randseed/random ?
it's quite important since I'm gonna use it in a big commercial app. about to be released..

thanks
0
 
JaymolCommented:
I personally agree with Mike (Edey) that writing your own random number generator is the best way to do this.  It's the only way you can guarantee the same results every time.  (With different versions as well!)

If you need help with that, let us know.  (Some people may be a bit arsey about doing that for 25 points, but maybe someone has one they could just give you without coding it.)

John.
0
 
craig_capelCommented:
If you use this method it works Fine..

var
 num: integer;

begin
  Randomize;  //take this out, then yes its always the same......
    num:=random(100);
///This actually makes it work as "random" numbers, although computers doing real random numbers? nahhh

end;


Craig C.


0
 
craig_capelCommented:
Getting better ant not reading all the questions before i make a comment..... in encryption xor or?
0
 
nricoCommented:
You could use some sort of extremely *sicko* formula that depends on the laster number given (Which would be randseed), something like this:

Const
  RandSeed:Integer=34750;

Function MyRandom:Integer;
Var
  Temp:Integer;
Begin
  Temp:=RandSeed*{ Sick formula goes here };
  RandSeed:=Temp;
  MyRandom:=Temp;
End;
0
 
topkapiCommented:
facts:

1: random numbers in computers dont exist. random uses a algorithm to produce pseudo-random numbers (it has all the properties of a random number set, but is not truly random). this algorithm always works only one way.

2: if you start the same algorithm with the same input (random seed), it produces the same output (random number).

assumption:

3: the random algorithm works the same on every computer, every time (ie: it does not care what system it is running on, or what the system-time is). to know this for sure, you need to check the source of the used algorithm.

so you're real question comes down to:
- is it always the same algorithm that is used to generate random numbers?

attemted answer:
- if you compile your application once, and then distribute it (the same application), then the algorithm used will be the same everywhere, and the output is also the same

- if you compile diffrent version of the app in diffrent versions of delphi, the algorithm used may not be the same. so then your output is diffrent. (as DrDelphi showed)

does this make it clearer?

topkapi
0
 
craig_capelCommented:
if you compile the code i gave u in delphi 1 2 3 and 4 or multiple copis in delphi 4 or 5 then... it will give different results everytime from the same exe.... is that not random... although yes it cant be totally random
0
 
edeyCommented:
I do have this, which I have based rng's on in the past, conversion should be trivial:

/*
C This random number generator originally appeared in "Toward a Universal
C Random Number Generator" by George Marsaglia and Arif Zaman.
C Florida State University Report: FSU-SCRI-87-50 (1987)
C
C It was later modified by F. James and published in "A Review of Pseudo-
C random Number Generators"
C
C THIS IS THE BEST KNOWN RANDOM NUMBER GENERATOR AVAILABLE.
C       (However, a newly discovered technique can yield
C         a period of 10^600. But that is still in the development stage.)
C
C It passes ALL of the tests for random number generators and has a period
C   of 2^144, is completely portable (gives bit identical results on all
C   machines with at least 24-bit mantissas in the floating point
C   representation).
C
C The algorithm is a combination of a Fibonacci sequence (with lags of 97
C   and 33, and operation "subtraction plus one, modulo one") and an
C   "arithmetic sequence" (using subtraction).
C========================================================================
This C language version was written by Jim Butler, and was based on a
FORTRAN program posted by David LaSalle of Florida State University.
*/

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

#define TRUE -1
#define FALSE 0
#define boolean int

static void rmarin(int ij, int kl);
void ranmar(float rvec[], int len);

void main()
{
      float temp[101];
      int ij, kl, len, i;

      /* random seeds for the test case: */
      ij = 1802;
      kl = 9373;

      /* do the initialization */
      rmarin(ij,kl);
      
      /* generate 20,000 random numbers */
      len = 100;
      for (i=1; i<=200; i++)
            ranmar(temp, len);
            
/*
C If the random number generator is working properly, the next six random
C numbers should be:
C           6533892.0  14220222.0  7275067.0
C           6172232.0  8354498.0   10633180.0
*/
       len = 6;
       ranmar(temp,len);
       
       for (i=1; i<=6; i++)
             printf("%12.1f ", 4096.0*4096.0*temp[i]);
}

static float u[98], c, cd, cm;
static int i97, j97;
static boolean test = FALSE;

static void rmarin(ij,kl)
int ij, kl;
{
/*
C This is the initialization routine for the random number generator RANMAR()
C NOTE: The seed variables can have values between:    0 <= IJ <= 31328
C                                                      0 <= KL <= 30081
C The random number sequences created by these two seeds are of sufficient
C length to complete an entire calculation with. For example, if sveral
C different groups are working on different parts of the same calculation,
C each group could be assigned its own IJ seed. This would leave each group
C with 30000 choices for the second seed. That is to say, this random
C number generator can create 900 million different subsequences -- with
C each subsequence having a length of approximately 10^30.
C
C Use IJ = 1802 & KL = 9373 to test the random number generator. The
C subroutine RANMAR should be used to generate 20000 random numbers.
C Then display the next six random numbers generated multiplied by 4096*4096
C If the random number generator is working properly, the random numbers
C should be:
C           6533892.0  14220222.0  7275067.0
C           6172232.0  8354498.0   10633180.0
*/
      int i, j, k, l, ii, jj, m;
      float s, t;
      
      if (ij<0 || ij>31328 || kl<0 || kl>30081) {
            puts("The first random number seed must have a value between 0 and 31328.");
            puts("The second seed must have a value between 0 and 30081.");
            exit(1);
      }
      
      i = (ij/177)%177 + 2;
      j = ij%177 + 2;
      k = (kl/169)%178 + 1;
      l = kl%169;
      
      for (ii=1; ii<=97; ii++) {
            s = 0.0;
            t = 0.5;
            for (jj=1; jj<=24; jj++) {
                  m = (((i*j)%179)*k) % 179;
                  i = j;
                  j = k;
                  k = m;
                  l = (53*l + 1) % 169;
                  if ((l*m)%64 >= 32) s += t;
                  t *= 0.5;
            }
            u[ii] = s;
      }
      
      c = 362436.0 / 16777216.0;
      cd = 7654321.0 / 16777216.0;
      cm = 16777213.0 / 16777216.0;
      
      i97 = 97;
      j97 = 33;
      
      test = TRUE;
}

void ranmar(rvec, len)
float rvec[];      /* len random numbers are placed in rvec[1..len] */
int len;
/*
C This is the random number generator proposed by George Marsaglia in
C Florida State University Report: FSU-SCRI-87-50
C It was slightly modified by F. James to produce an array of pseudorandom
C numbers.
*/
{
      int ivec;
      float uni;
      
      if (test==FALSE) {
            puts("Call the init routine rmarin() before calling ranmar().");
            exit(2);
      }
      for (ivec=1; ivec<=len; ivec++) {
            uni = u[i97] - u[j97];
            if (uni < 0.0) uni += 1.0;
            u[i97] = uni;
            i97--;
            if (i97==0) i97 = 97;
            j97--;
            if (j97==0) j97 = 97;
            c -= cd;
            if (c<0.0) c += cm;
            uni -= c;
            if (uni<0.0) uni += 1.0;
            rvec[ivec] = uni;
      }
}



GL
Mike
0
 
JaymolCommented:
This is getting a bit silly really isn't it!  All you need to do is make your own Random() function.  End of story!

John.
0
 
craig_capelCommented:
True... agrees with Jaymol
0
 
edeyCommented:
hmmmm....
that would be what the above function is for


Gl
Mike
0
 
craig_capelCommented:
Agrees with everyone :) hehe
0
 
bryan7Author Commented:
hi there, sorry I've been away for a few.. who should I give some points to ?
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 5
  • 4
  • 3
  • +6
Tackle projects and never again get stuck behind a technical roadblock.
Join Now