Jump to content

Better random()


Recommended Posts

Posted (edited)

This function returns a random number with minimum min and maximum max with normal distribution. More info here

public static int rand(int min, int max)
{
	int n;
	int mean = (min + max) / 2;
	int std = (max - mean) / 3;
	Random r = new Random();
	do {
		double val = r.nextGaussian() * std + mean;
		n = (int) Math.round(val);
	} while (n < min || n > max);
	return n;
}
Edited by SESH
Posted

Not all that great, since that while loop can potentially block forever...

    private final Random random = new Random();    

    public int exclusive(int min, int max) {
        if (max <= min) {
            max = min + 1;
        }
        return random.nextInt((max - min)) + min;
    }

    public int exclusive(int range) {
        return exclusive(0, range);
    }

    public int inclusive(int min, int max) {
        if (max < min) {
            max = min + 1;
        }
        return exclusive((max - min) + 1) + min;
    }

    public int inclusive(int range) {
        return inclusive(0, range);
    } 
Posted

 

Not all that great, since that while loop can potentially block forever...

    private final Random random = new Random();    

    public int exclusive(int min, int max) {
        if (max <= min) {
            max = min + 1;
        }
        return random.nextInt((max - min)) + min;
    }

    public int exclusive(int range) {
        return exclusive(0, range);
    }

    public int inclusive(int min, int max) {
        if (max < min) {
            max = min + 1;
        }
        return exclusive((max - min) + 1) + min;
    }

    public int inclusive(int range) {
        return inclusive(0, range);
    } 

Well what you did there is too complicated, what you can do is this: 

static Random r = new Random();
public static int rand (int mean, int stdDev){
	return (int) (r.nextGaussian()*stdDev+mean);
}
Posted

 

Well what you did there is too complicated, what you can do is this: 

static Random r = new Random();
public static int rand (int mean, int stdDev){
	return (int) (r.nextGaussian()*stdDev+mean);
}

 

How is what I did complicated? I gave methods that support both inclusive and exclusive intervals.

Posted (edited)

 

Not all that great, since that while loop can potentially block forever...

    private final Random random = new Random();    

    public int exclusive(int min, int max) {
        if (max <= min) {
            max = min + 1;
        }
        return random.nextInt((max - min)) + min;
    }

    public int exclusive(int range) {
        return exclusive(0, range);
    }

    public int inclusive(int min, int max) {
        if (max < min) {
            max = min + 1;
        }
        return exclusive((max - min) + 1) + min;
    }

    public int inclusive(int range) {
        return inclusive(0, range);
    } 

 

It would be incredibly, incredibly unlikely for it to even run through the while loop twice. 

Edited by SESH

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...