|
|
@@ -0,0 +1,66 @@ |
|
|
|
/* |
|
|
|
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(unsigned int 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; } |
|
|
|
|