Subject: Inconsistent recommendations


There are several substantive problems with your code, mostly due, I am
sure, to my posting R code which is unfamiliar.  The most important that I
see off-hand is that the exponential random variable must be defined as:

         - Math.log(1 - Math.random())

The idea is that the argument to log must be in the range (0, 1] so that the
result will be in the range [0, inf).  The 1-Math.random() is that way
because the range of Math.random() is [0, 1) instead of (0, 1].

I have a few style beefs that I hope you will take in good humor as well.

I will make comments about both of these in-line.

On Tue, Jun 30, 2009 at 10:27 AM, Otis Gospodnetic <
You should use double for all of this code, otherwise your code may be
considerably slower than desired due to float/double conversions and also
since we are doing exp of some potentially good sized numbers, it is very
easy to run out of dynamic range for floats leading to very surprising
results.  This is essentially a style question, but I find it to be a very
bad idea to do this kind of premature optimization of floating point

     float exp = (float) i / 5;                                    // not
> sure why you used -i /n
-i/n was used because that will lead to doing exp(negative number).  For
large negative numbers, the slope of exp() becomes very flat which makes
large rearrangements possible.  Without the negation, the randomization will
have a very different effect.

     float rexp = (float) Math.log(i-Math.random());   // tried with 1
> instead of i like you said, too
The 1 is critical as mentioned above.

     float rank = exp + rexp * 0.1f;
I don't see a call to Math.exp anywhere.  Perhaps it got lost?  That would
probably explain a large part of the problems.  Also, this is not the rank,
but rather the synthetic score.  Thus this is a misleading name.

     float round = Math.round(rank);
I don't think that you want to round like this.  Instead, what you should be
doing is accumulating the scores in an array and then sorting the scores.
What I displayed was a permutation that resulted from sorting.
>      System.out.println("EXP: " + exp + "\tREXP: " + rexp + "\RANK: " +
> rank + "\tROUND: " + round);
>    }