44 lines
		
	
	
		
			742 B
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			44 lines
		
	
	
		
			742 B
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |  * Copyright (c) 2006-2018, 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"))); |