Go Down

### Topic: Random() Maximum (Read 3189 times)previous topic - next topic

#### woo_oow

##### Jul 14, 2007, 01:03 am
Hello there!

I need to create by random really large numbers.
Does the random() function whose type is set as "long", return numbers in the range of long?
between 0 and 2,147,483,647?
when i try to check it by printing the value over serial, it returns always 16807.

any suggestions?

#### woo_oow

#1
##### Jul 14, 2007, 02:22 amLast Edit: Jul 14, 2007, 02:02 pm by woo_oow Reason: 1
mh.
im not shure yet.
What is the maximum value i can transmit over serial?
is it the "int" range?
if it is so, how can i send values of the size of "long" over the serial?
(perhaps i should start another topic for that)

woo

#### kg4wsv

#2
##### Jul 14, 2007, 02:06 pm
what does your random() call look like?

Integer constants that you want to be of type long need an "L" at the end, e.g.  i = random(2000000L);

-j

#### woo_oow

#3
##### Jul 14, 2007, 02:27 pm
at the moment it looks like:

long x = random(1576800000);
(actually its the amount of seconds of 50 years)

so it should look like: long x = random(1576800000L);?

thanks
w

#### kg4wsv

#4
##### Jul 14, 2007, 07:58 pm
Quote
so it should look like: long x = random(1576800000L);

that's correct.

-j

#### woo_oow

#5
##### Jul 14, 2007, 08:08 pmLast Edit: Jul 14, 2007, 08:36 pm by woo_oow Reason: 1
Thanks!
this very good to know.

w

#### woo_oow

#6
##### Jul 14, 2007, 08:35 pm
There is still a problem:
over the serial i get only values until 5 digits.
for evaluation i used this code:

long x;
void setup(){
Serial.begin(9600);
}
void loop(){
x=random(1576800000L);
Serial.println (x);
delay(100);
}

it returns values until 32 thousand something.
i dont need the serial thing, but i want to be shure if the random numbers are
created throughout the entire range.
is it just a serial problem?

w

#### mellis

#7
##### Jul 15, 2007, 03:14 pm
Whoops, looks like you found a bug in the core.  We're calling the wrong AVR function, so you'll only get numbers from 0 to 32,767.  You could try calling random() twice and putting the number together, e.g.:

(random(32768) << 15) + random(32768);

#### woo_oow

#8
##### Jul 15, 2007, 09:38 pm

this could be a solution. I'll try it.

best

w

#9
##### Aug 11, 2007, 01:39 am
Did you solve it?

By the way, Mellis solution doesn't really get up to your needs. We need one more bit:

(random(1) << 30) + (random(32768) << 15) + random(32768);

If anyone is intrested in a deeper explanation, here is my late-night go:

The random() function can random a highest number of 32,767 which would be it returns 15 bits of random data, so in order to get a larger number we need to connect two or more of those 15 bit chunks.

What we are doing here: (random(32768) << 15) is simply that we push randomed bits 15 bits forward on the variable:
00000000 00000000 0xxxxxxx xxxxxxxx gets into:
<----15 steps
00xxxxxx xxxxxxxx x0000000 00000000

Then we add with the next chunk of random data:
00xxxxxx xxxxxxxx x0000000 00000000 +
00000000 00000000 0xxxxxxx xxxxxxxx =
00xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

Oh, i noticed now that your maximum random number doesn't follow any 2^x number... ok, lets see...

We need to find the largest exponentation in the number:
1 576 800 000 - 1 073 741 824 = 503 058 176

Now we do the same with our result: 503 058 176
503 058 176 - 268 435 456 = 234 622 720

234 622 720 - 134 217 728 = 100 404 992

Oh heck,  i am too tired, just look up which bits in 1 576 800 000 are 1 and make one random(2^x) for each of them where x is the position of the bit (fir example if first bit (bit numer 0) is true, max random is 2 ^ 0 = 1. If the maximum gets over 32 767 just split together like i explained above.

Goodnight!

#### woo_oow

#10
##### Aug 13, 2007, 07:44 am
Thanks man,

you're right, like this it should generate numbers throughout the field i need, thats great.
i'll try this soon. (at the moment i'm in shanghai, for visiting a friend - its the ultimate electronic parts paradise, you find everything you ever dreamed of!!!)

w

#### Daniel

#11
##### Aug 13, 2007, 08:21 am
Quote
(at the moment i'm in shanghai, for visiting a friend - its the ultimate electronic parts paradise, you find everything you ever dreamed of!!!)

is it better than this? I was in Seoul a month ago... They have whole malls full of IC's..
http://www.flickr.com/photos/electromarketman/sets/72157601136408488/

#12
##### Aug 14, 2007, 10:35 pm
I am so going to Seoul! Just have to persuade my family that they want to go there aswell.

#### woo_oow

#13
##### Sep 10, 2007, 06:09 pm
Its really great to be at places like this!
Daniel, the pictures of Seoul are looking like the Malls in Shanghai. Fantastic.

@ Mellis: in Arduino 0009 is there still a Bug in Random()?

w

#### mellis

#14
##### Sep 10, 2007, 07:06 pm
Yes, sorry, I didn't have a chance to fix it.  Don't worry it's still on the list, hopefully I'll get to it in 0010.

Go Up

Please enter a valid email to subscribe