# Re: [ljc] A little Friday morning challenge for the group...

 From: Michael R. Sent on: Saturday, January 26, 2013 12:10 PM
```-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 25/01/13 11:01, Wesley Hall wrote:
> Your mission, should you choose to accept it, is to write a method,
> in Java, with the following signature...
>
> public static long generateRandom(long min, long max) { // code
> here }

My attempt (rather heavyweight but I think it's correct):

import java.math.BigInteger;­
import java.util.Random;

public class LongRandom {

private static final Random random = new Random();

public static long generateRandom(long min, long max) {
BigInteger bigMin = BigInteger.valueOf(m­in);
BigInteger bigMax = BigInteger.valueOf(m­ax);
BigInteger exclusive = bigMax.subtract(bigM­in);
// Work out how many bytes we need to generate
int bits = exclusive.bitLength(­);
int bytes = (bits % 8 == 0) ? bits / 8 : bits / 8 + 1;
assert bytes > 0 && bytes <= 8;
// The PRNG generates bytes, so there will be up to 7 spare bits
int spareBits = bytes * 8 - bits;
assert spareBits >= 0 && spareBits < 8;
// Mask out the spare bits each time we generate bytes
for(int i = 0; i < spareBits; i++) mask ^= 1 << (7 - i);
// Generate random bytes until we get a value in the required
// range (unlike the modulus, this gives a uniform distribution)
byte[] b = new byte[bytes];
BigInteger rand;
do {
random.nextBytes(b);­
rand = new BigInteger(1, b); // Positive signum
} while(rand.max(inclu­sive).equals(rand));­
assert rand.min(bigMin).equ­als(bigMin); // rand >= min
assert rand.max(bigMax).equ­als(bigMax); // rand <= max
return rand.longValue();
}
}

Cheers,
Michael

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iQEcBAEBAgAGBQJRA8es­AAoJEBEET9GfxSfM3ZoI­AIPXmuAFuU4+zzQi0mGU­d2vL
X3d7z0fO1PsKYRLiD4wv­gtz6u8gcwfCpLLj7EXvL­R0uC4O6MbgAbQdIBzkUA­H+ly
IkftRzwOpWwLhUnaoK01­Cqa2dzCQ+3lfWN59uz8Q­mjs6UDEW0PoedlKLlcpJ­Un66
YrfaUoDDvzODs/jyuqwY­mC4loqDcDWI6WyE/Wpk3­D0NNDJmBG6tdqUSDkum4­DcgI
q0QA4SUKusM0vSDhf69a­qc+yiVByZ/1robvSuTAT­5sk3fmmdF09ZH32aPpJB­36pA
MCGDtWnFLEGjQ0pMNUUa­99PMMErQzA08ut8lscfC­W4Vz3IEzQ6pK1GOeVmcI­a68=
=LuNA
-----END PGP SIGNATURE-----
```

### London, United Kingdom

Founded Nov 26, 2007

#### Organizers:

Contact

• ##### Our Blog

Read the latest news from the LJC

• ##### RecWorks Ltd

Fixing Tech Recruitment using the Power of Community

• ##### jClarity

Java/JVM Performance Analysis Tools & mentoring for Java related matters

• ##### LJC Aggrity

Our LJC Aggrity site contains blog posts from our members

• ##### LJC Book Club

Our Book club with book reviews from our members

• ##### Devoxx UK

Java Community Conference, in collaboration with the LJC 12/13 Jun 14

• ##### SkillsMatter

"Host, help organise, promote, film many of our meetings."

• ##### New Relic

New Relic makes sense of billions of metrics a day in real time.

• ##### Hazelcast

Hazelcast is the leader in operating in-memory computing.

• ##### Packt Publishing

A publishing company specializing on specific technologies and solutions

• ##### Java.Net

We are an official Java User Group recognised by Oracle's JUG program

• ##### O'Reilly

40% discount on printed books and 50% on e-books.

#### People in this Meetup are also in:

• ##### Deep Learning London Meetup

1,053 Neurons

• ##### London Code Dojo

1,316 Developers

• ##### OpenSource & Agile Community Events

2,701 OpenSource and Agile developers

• ##### HNLondon

7,180 Hackers

• ##### London OpenCoffee Meetup

7,626 Entrepreneurs

• ##### London Software Craftsmanship Community

2,782 Software Crafters