summaryrefslogtreecommitdiff
path: root/components/libc/compilers/minilibc/rand.c
blob: 8bbf42a32bb7c3ece0ec63d11dfe34cf6e91be88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 */
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>

static unsigned int _seed=1;

/* Knuth's TAOCP section 3.6 */
#define M   ((1U<<31) -1)
#define A   48271
#define Q   44488       // M/A
#define R   3399        // M%A; R < Q !!!

int rand_r(unsigned int* seed)
{   int32_t X;

    X = *seed;
    X = A*(X%Q) - R * (int32_t) (X/Q);
    if (X < 0)
    X += M;

    *seed = X;
    return X;
}

int rand(void) {
  return rand_r(&_seed);
}

void srand(unsigned int i)
{
    _seed=i;
}

int random(void) __attribute__((alias("rand")));
void srandom(unsigned int i) __attribute__((alias("srand")));