HiveBrain v1.2.0
Get Started
← Back to all entries
patternphpMinor

Galaxy generator

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
galaxygeneratorstackoverflow

Problem

I'm currently working on a galaxy generator, and I was in need of getting the next that a random would use, for continuing the generation without using a blank generation (re-run previous generation).

I made this little PHP class to do that and implemented a float rand() method.

Please provide advice on improvements.

seed = $seed;
    }

    public function getSeed() {
        return $this->seed;
    }

    public function rand($min = 0, $max = 0) {
        $this->seed = ($this->seed * 1103515245 + 12345) & GC_RAND_MAX;
        $number = (($this->seed >> 1) & GC_RAND_MAX);

        if ($min > $max) { $min = $max; $max = $min; }
        else { $min = $min; $max = $max; }
        if ($max - $min)
            $number = ($number % ($max + 1 - $min)) + $min;

        return $number;
    }

    public function getRandMax(){
        return GC_RAND_MAX;
    }

    public function floatRand($Min, $Max, $round = 0) {
        //validate input
        if ($Min > $Max) { $Min = $Max; $Max = $Min; }
        else { $Min = $Min; $Max = $Max; }

        $range = $Max - $Min;
        $randomfloat = $Min + $range * ($this->rand() rand()) / (GC_RAND_MAX >> 1);

        if($round > 0)
            $randomfloat = round($randomfloat, $round);
        return $randomfloat;
    }
}

Solution

You haven't documented your pseudorandom generators. This makes reacting to the code a lot harder. What algorithm are you trying to use? Mersenne Twister? Lehmer? Inversive congruential? Linear congruential? Middle square? Your own?

I've dabbled a bit, in the past, with writing random generators myself. I have concluded two things:

  • It is a lot harder, to get right, than it looks. Books have been written about this.



  • If you write your own generator you have to analyse its output. How random is it really? https://www.random.org/analysis



I would strongly advise to use an existing algorithm, and document this in your code, with references. In all other cases use a built-in generator, PHP has several. You've already seen that rand() isn't the best, but you could use:

http://php.net/manual/en/function.random-int.php

Note that they document the used algorithm. If you use Linux then the generator relies on entropy gathered from device drivers and other sources of environmental noise, which is a better way to get 'truly' random results, because it is less deterministic.

As for your code, I noticed that you use this line twice:

if ($min > $max) { $min = $max; $max = $min; }


This is overkill when the following will do:

if ($min > $max) $min = $max;


This does not increase my confidence in the quality of your generators.

Code Snippets

if ($min > $max) { $min = $max; $max = $min; }
if ($min > $max) $min = $max;

Context

StackExchange Code Review Q#131409, answer score: 2

Revisions (0)

No revisions yet.