-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRANDOM.c
79 lines (67 loc) · 3.08 KB
/
RANDOM.c
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*════════════════════════════════════════╦═════════════════════════════╗
║ C - RANDOM ║ Maximum Tension ║
╠═════════════════════════════════════════╬═════════════════════════════╣
║ │ ▄▄▄ ▄▄▄ ║
║ Teoman Deniz │ ░ ░▒▓▒▄▄ ▄▄▒▓▒░ ░ ║
║ maximum-tension.com │ ░░ ░░ ║
║ │ ░▒░ ░ ░░ ░ ░ ░ ░░░░▒░ ║
║ ╔───┬──────────────────╗ │ ░▒░░ ░▒░▒▓░▒░▒░░▓░░░▒▒▒░ ║
║ │ © │ Maximum Tension │ ┌──────────────┤ ░░▒░░▒▒▓██▓█▓█▒░▒▓▓▒▒░░ ║
║ ├───┴─────┬────────────┤ │ C 2023/02/08 │ ░▒▓▒▒▓▓██████████▓▓▒▒░ ║
║ │ License │ GNU │ │──────────────│ ░░░░▒▒▒▓▒▒▓▒▒▒▓▒▒▒░░ ║
║ ╚─────────┴────────────╝ │ U 2023/02/09 │ ░░░░▒░░▒░░░▒░░░░ ║
╚══════════════════════════╩══════════════╩════════════════════════════*/
#include "../#C_MT.h"
#ifndef __TINYC__
TYPEDEF UNION U_CAST
{
CONST CHAR *POINTER;
UNSIGNED LONG INTEGER;
} T_CAST;
# ifdef __STDC__
INT
RANDOM(REGISTER INT MIN, REGISTER INT MAX)
# else
INT
RANDOM(MIN, MAX)
REGISTER INT (MIN);
REGISTER INT (MAX);
# endif
{
STATIC UNSIGNED LONG (ADDRESS);
STATIC INT (SEED);
CHAR (POINTER)[8192];
T_CAST (CAST);
SEED = SEED + 0;
IF (!SEED)
{
CAST.POINTER = &POINTER[SEED];
ADDRESS = CAST.INTEGER + \
((UNSIGNED LONG)__TIME__[0] \
* (UNSIGNED LONG)__TIME__[1] \
+ (UNSIGNED LONG)__TIME__[3] \
* (UNSIGNED LONG)__TIME__[4] \
+ (UNSIGNED LONG)__TIME__[6]) \
* (UNSIGNED LONG)__TIME__[7];
}
ADDRESS = (ADDRESS * 1103515245 + 12345) & 0x7fffffff;
SEED++;
RETURN (MIN + (INT)((DOUBLE)ADDRESS / (0x7fffffff / (MAX - MIN + 1))));
}
#else
# ifdef __STDC__
INT
RANDOM(REGISTER INT MIN, REGISTER INT MAX)
# else
INT
RANDOM(MIN, MAX)
REGISTER INT (MIN);
REGISTER INT (MAX);
# endif
{
REGISTER LONG (SEED);
SEED = (LONG) TIME(NULL);
SEED = (SEED * 1103515245 + 12345) & 0x7fffffff;
RETURN (MIN + (INT)((DOUBLE)SEED / (0x7fffffff / (MAX - MIN + 1))));
}
#endif