1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero */ 9*10465441SEvalZero #include <stdlib.h> 10*10465441SEvalZero #include <stdint.h> 11*10465441SEvalZero #include <sys/types.h> 12*10465441SEvalZero 13*10465441SEvalZero static unsigned int _seed=1; 14*10465441SEvalZero 15*10465441SEvalZero /* Knuth's TAOCP section 3.6 */ 16*10465441SEvalZero #define M ((1U<<31) -1) 17*10465441SEvalZero #define A 48271 18*10465441SEvalZero #define Q 44488 // M/A 19*10465441SEvalZero #define R 3399 // M%A; R < Q !!! 20*10465441SEvalZero rand_r(unsigned int * seed)21*10465441SEvalZeroint rand_r(unsigned int* seed) 22*10465441SEvalZero { int32_t X; 23*10465441SEvalZero 24*10465441SEvalZero X = *seed; 25*10465441SEvalZero X = A*(X%Q) - R * (int32_t) (X/Q); 26*10465441SEvalZero if (X < 0) 27*10465441SEvalZero X += M; 28*10465441SEvalZero 29*10465441SEvalZero *seed = X; 30*10465441SEvalZero return X; 31*10465441SEvalZero } 32*10465441SEvalZero rand(void)33*10465441SEvalZeroint rand(void) { 34*10465441SEvalZero return rand_r(&_seed); 35*10465441SEvalZero } 36*10465441SEvalZero srand(unsigned int i)37*10465441SEvalZerovoid srand(unsigned int i) 38*10465441SEvalZero { 39*10465441SEvalZero _seed=i; 40*10465441SEvalZero } 41*10465441SEvalZero 42*10465441SEvalZero int random(void) __attribute__((alias("rand"))); 43*10465441SEvalZero void srandom(unsigned int i) __attribute__((alias("srand"))); 44