Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

This method randomly increments or decrements (with equal probability) until either -3 or 3 are reached. I'd like to maintain printing the value of pos on each iteration, and printing the largest positive number max reached at the end of the loop. How can I improve this method using the Random() function? I know this sounds pretty ambiguous, but I'd like to know if I can make rand.nextInt(2) == 0 an easier condition to understand? Any suggestions/improvements are welcome!

public static void randomWalk() {
    Random rand = new Random();
    int pos = 0;
    int max = 0;
    System.out.println("position = " + pos);
    while (pos > -3 && pos < 3) {
        if (rand.nextInt(2) == 0) {
            pos++;
            if (pos > 0) {
                max = pos;
            }
        } else {
            pos--;
        }
        System.out.println("position = " + (int) pos);
            
    }
    System.out.println("max position = " + max);
}
share|improve this question

2 Answers 2

There's a minor bug there:

        if (pos > 0) {
            max = pos;
        }

should test pos > max instead.


Use

max = Math.max(max, pos)

to make it shorter.


I'd like to know if I can make rand.nextInt(2) == 0 an easier condition to understand?

Use rand.nextBoolean(). For a probability of exactly 50%, it's perfect.

For other probabilities, you can use

 rand.nextDouble() < probability

Another possibility is simply

pos += 2 * rand.nextInt(2) - 1;
max = Math.max(max, pos);

or

pos += rand.nextBoolean() ? 1 : -1;
max = Math.max(max, pos);

or

private static final int[] DELTAS = {+1, -1};

pos += DELTAS[rand.nextInt(DELTAS.length)];
max = Math.max(max, pos);

without any conditionals. You may consider it tricky, but it isn't. Obviously, my last solution shouldn't be used for such a simple case.

Concerning the computation of max it may be slightly less efficient since it gets executed even if the value decreases. But this doesn't matter unless you need to optimize heavily (your print is many orders of magnitude slower than this).

share|improve this answer

Expression

pos > -3 && pos < 3

Can be

Math.abs(pos) < 3

Random choice

Java Random had method for sampling boolean values nextBoolean

Bug

This line

if (pos > 0) {

do not give you

the largest positive number max reached at the end of the loop

Improvement

You don't need to make loop at all. You need random generator that will provide 2 values at each iteration:

  • max positive number
  • 3 or -3

This can be done using random in following way

long sample = Math.abs(rand.nextLong());
int pos, max;
if (sample % 2 == 0) {
    pos = 3;
    max = 3;
} else {
    pos = -3;
    max = int(sample % 3);
}
share|improve this answer
    
Concerning pos, you're right. Concerning max, you're most probably wrong as not all values are equiprobable. Even if they were, you're missing the case max==3. Concerning the pair (pos, max), as the probabilities are'nt independent, for example pos==-3 and max==2 is rather improbable. And pos==3 and max<3 is plain impossible. –  maaartinus yesterday
    
@maaartinus max never be 3, read TC's code. I'm so sorry I can't downvote this comment. pastebin.com/nnyTp0CK –  outoftime yesterday
2  
Why shouldn't it be 3. First gets pos incremented to 3, then max computed, and then the loop exits. However, it's all irrelevant, as you can't shortcut the max computation to something that trivial. -1 This simply can't work. –  maaartinus yesterday
    
@maaartinus Now I see problem with max value. Fixed. –  outoftime yesterday
    
@maaartinus but I'm not agree that part of uniform distribution can be not uniform. This relate to max and pos values, as they are both parts of uniformly distributed values of sample –  outoftime yesterday

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.