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

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

Aww shucks. Thanks Stuart, that's very kind. :-)

Cheers,
Michael

On 26/01/13 17:07, Stuart Wakefield wrote:
> I'm going to hands down call Michael my hero. The solution that I
> came up with is quick and dirty and quite right it won't return
> every value of long because there are not enough distinct values of
> double between 0.0 and 1.0 to cover every distinct value of long.
> The problem with a do while for Random.nextLong() is for a small
> range you could be generating a huge number of random longs but you
> should get an equal distribution (it says in the docs that the seed
> is only 48 bits so you don't get every value of long but I must be
> too dumb to understand why because the source shows that it simply
> packs two random ints which it says there should be an
> approximately equal distribution). Michael's solution while quite
> long tackles to problem of nextLong by increasing the probability
> of a match by only generating a number with the amount of bits
> required to represent the range, this will reduce the number of
> potential loops to return a match within the required range. Genius
> and my hero.
>
>
> On Sat, Jan 26, 2013 at 3:38 PM, Wesley Hall
> wrote:
>
> Michael,
>
> Nice :). I would have to say that all the bit shifting and binary
> mathematics is probably a good sign that you are smarter than I
> am. Curse these inconvenient ten fingers ;).
>
> Jahan,
>
> Yeah, actually once I figured out the max - min problem, then the
> next step my mind took was to do some midpoint calculations. I put
> your solution into my IDE and tested it and it appears to work
> beautifully, the only anomaly I can see is that for a range -100 to
> 100, then 0 is about twice as frequent as any other given result.
>
>
>
> On Sat, Jan 26, 2013 at 12:33 PM, Michael Rogers
> wrote: 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); BigInteger inclusive =
> exclusive.add(BigInt­eger.ONE); // 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 int mask = 0xff; 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);­ b[0] &= mask; // Mask out the spare bits rand
> = new BigInteger(1, b); // Positive signum }
> assert rand.min(bigMin).equ­als(bigMin); // rand >= min assert
> rand.max(bigMax).equ­als(bigMax); // rand <= max return
> rand.longValue(); } }
>
> Cheers, Michael
>
>>
>>
>>
>>
> everyone on this mailing list ([address removed]
>> http://www.meetup...­ This message was sent
>> by Michael Rogers ([address removed]
> <mailto:[address removed]>) from LJC - London Java
> Community.
>> profile:
> http://www.meetup...­
>> Set my mailing list to email me
>>
>> As they are sent
>> http://www.meetup...­
>>
>> In one daily email
>> http://www.meetup...­
>>
>> Don't send me mailing list messages
>> http://www.meetup...­
>> Meetup, POB 4668 #37895 NY NY USA 10163 | [address removed]
>>
>
>
>
>
> everyone on this mailing list ([address removed]
> http://www.meetup...­ This message was sent by
> <mailto:[address removed]>) from LJC - London Java
> profile:
> http://www.meetup...­ Set my
> mailing list to email me
>
> As they are sent
> http://www.meetup...­
>
> In one daily email
> http://www.meetup...­
>
> Don't send me mailing list messages
> http://www.meetup...­
> Meetup, POB 4668 #37895 NY NY USA 10163 | [address removed]
>
>
>
>
>
>
> *everyone* on this mailing list ([address removed]
> <mailto:[address removed]>) This message was sent by Stuart
> Wakefield ([address removed]) from LJC - London Java
> Community <http://www.meetup...;­. To learn
> more about Stuart Wakefield, visit his/her member profile
> <http://www.meetup...;­ Set
> my mailing list to email me As they are sent
> <http://www.meetup...;­ | In
> one daily email
> <http://www.meetup...;­ |
> Don't send me mailing list messages
> <http://www.meetup...;­
>
> Meetup, POB 4668 #37895 NY NY USA 10163 <#> | [address removed]

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

iQEcBAEBAgAGBQJRBBph­AAoJEBEET9GfxSfMU5gH­/2eAIF5UzUwtUP4mHgOj­+JdY
5Fg+cjCPC6JnxPuluMOG­vnvFSvn/smjPTtUbPkRx­lAMSwwK/v1n9q6Bzwxw7­gSr5
XXpVj2Y/Hs/g5zr2O1SG­d8mgQ/DhXfbYHEANQcUJ­a7W2R5Vw/P+LuhJCZ893­9Kmx
7aIejpzm3VQD8WDEUCI9­p9OgIHFLNcxCIAkPRJDD­FuotukAIL7hqwgvvrWwa­quNv
/gyLJzVR4cWexHUgx71W­NFlsa/PESrTnq67hjLAc­GoPYHta1ZDxbql3NoT/R­Suks
IxF4S+U09N/qtjpys/VC­OPMdWlkHtdm47/teEB82­7EPtiuudSR+PlKycJyET­gNk=
=LLTJ
-----END PGP SIGNATURE-----
```

### London, United Kingdom

Founded Nov 26, 2007

#### Organizers:

• ##### 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, 8-10th June 16

• ##### SkillsMatter

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

• ##### IBM

Build Enterprise-grade apps at start-up speed.

• ##### 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.

• ##### 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.

• ##### Craft Rebellion

Your choice of fresh craft beer, delivered. For 10% off use ‘LJC'

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

• ##### Big Data Analytics in London

4,243 Data Mashers

• ##### Virtual Java User Group

10,312 vJUGers

6,000 LSR Members

• ##### London Functional Programmers

944 Functionals

• ##### London Python

2,771 Pythonistas

• ##### PyData London Meetup

4,231 members