Skip to content

Commit c1fd054

Browse files
committed
Merge pull request energia#66 from energia/issue_63
Issue 63. Add random() and randomSeed() core functions.
2 parents 97a90b7 + 1366f8e commit c1fd054

File tree

2 files changed

+96
-2
lines changed

2 files changed

+96
-2
lines changed

hardware/msp430/cores/msp430/WMath.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@
2525

2626
extern "C" {
2727
#include "stdlib.h"
28+
/* Using interal random and srandom in file random.c
29+
* until msp430-libc adds supports for random and srandom */
30+
extern long random(void);
31+
extern void srandom(unsigned long __seed);
2832
}
29-
#if 0
33+
3034
void randomSeed(unsigned int seed)
3135
{
3236
if (seed != 0) {
@@ -50,7 +54,7 @@ long random(long howsmall, long howbig)
5054
long diff = howbig - howsmall;
5155
return random(diff) + howsmall;
5256
}
53-
#endif
57+
5458

5559
long map(long x, long in_min, long in_max, long out_min, long out_max)
5660
{

hardware/msp430/cores/msp430/random.c

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*-
2+
* Copyright (c) 1990, 1993
3+
* The Regents of the University of California. All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions
7+
* are met:
8+
* 1. Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
* 2. Redistributions in binary form must reproduce the above copyright
11+
* notice, this list of conditions and the following disclaimer in the
12+
* documentation and/or other materials provided with the distribution.
13+
* 3. Neither the name of the University nor the names of its contributors
14+
* may be used to endorse or promote products derived from this software
15+
* without specific prior written permission.
16+
*
17+
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20+
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23+
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27+
* SUCH DAMAGE.
28+
*
29+
* Posix rand_r function added May 1999 by Wes Peters <[email protected]>.
30+
*
31+
* $Id$
32+
*/
33+
34+
/*
35+
* From:
36+
static char sccsid[] = "@(#)rand.c 8.1 (Berkeley) 6/14/93";
37+
*/
38+
#ifndef RANDOM_MAX
39+
#define RANDOM_MAX 0x7FFFFFFF
40+
#endif
41+
42+
#include <stdlib.h>
43+
44+
static long
45+
do_random(unsigned long *ctx)
46+
{
47+
/*
48+
* Compute x = (7^5 * x) mod (2^31 - 1)
49+
* wihout overflowing 31 bits:
50+
* (2^31 - 1) = 127773 * (7^5) + 2836
51+
* From "Random number generators: good ones are hard to find",
52+
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
53+
* October 1988, p. 1195.
54+
*/
55+
long hi, lo, x;
56+
57+
x = *ctx;
58+
/* Can't be initialized with 0, so use another value. */
59+
if (x == 0)
60+
x = 123459876L;
61+
hi = x / 127773L;
62+
lo = x % 127773L;
63+
x = 16807L * lo - 2836L * hi;
64+
if (x < 0)
65+
x += 0x7fffffffL;
66+
return ((*ctx = x) % ((unsigned long)RANDOM_MAX + 1));
67+
}
68+
69+
70+
long
71+
random_r(unsigned long *ctx)
72+
{
73+
return do_random(ctx);
74+
}
75+
76+
77+
static unsigned long next = 1;
78+
79+
long
80+
random(void)
81+
{
82+
return do_random(&next);
83+
}
84+
85+
void
86+
srandom(unsigned long seed)
87+
{
88+
next = seed;
89+
}
90+

0 commit comments

Comments
 (0)