|
- /*
- Part of the Wiring project - http://wiring.org.co
- Copyright (c) 2004-06 Hernando Barragan
- Modified 13 August 2006, David A. Mellis for Arduino - http://www.arduino.cc/
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General
- Public License along with this library; if not, write to the
- Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- Boston, MA 02111-1307 USA
- */
-
- #include <stdint.h>
-
- static uint32_t seed;
-
- void randomSeed(uint32_t newseed)
- {
- if (newseed > 0) seed = newseed;
- }
-
- void srandom(uint32_t newseed)
- {
- seed = newseed;
- }
-
- int32_t random(void)
- {
- int32_t hi, lo, x;
-
- // the algorithm used in avr-libc 1.6.4
- x = seed;
- if (x == 0) x = 123459876;
- hi = x / 127773;
- lo = x % 127773;
- x = 16807 * lo - 2836 * hi;
- if (x < 0) x += 0x7FFFFFFF;
- seed = x;
- return x;
- }
-
- uint32_t random(uint32_t howbig)
- {
- if (howbig == 0) return 0;
- return random() % howbig;
- }
-
- int32_t random(int32_t howsmall, int32_t howbig)
- {
- if (howsmall >= howbig) return howsmall;
- int32_t diff = howbig - howsmall;
- return random(diff) + howsmall;
- }
-
- unsigned int makeWord(unsigned int w) { return w; }
- unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; }
|