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.
mh.
im not shure yet.
i thought about the serial.
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)
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?
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.:
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.
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!!!)
Hi
I'm about to try out your suggestions. I'm a bit confused, but i think i'll manage it.
Now i read about the 2's complement math, wich is used for the int values.
Do i shift as well the first bit, the one to sign the value?
Not yet. Arduino 0011 will focus more on improvements to the core, so it might happen then, but no promises. I don't think many people need such large random numbers (though maybe I'm wrong).