patternphpMinor
Galaxy generator
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
Please provide advice on improvements.
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:
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
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:
This is overkill when the following will do:
This does not increase my confidence in the quality of your generators.
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.