Subversion Repositories Kolibri OS

Rev

Rev 5582 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5598 pavelyakov 1
#ifndef INCLUDE_RANDOM_H
2
#define INCLUDE_RANDOM_H
3067 leency 3
 
5598 pavelyakov 4
#ifndef INCLUDE_KOLIBRI_H
5
#include "../lib/kolibri.h"
6
#endif
3067 leency 7
 
5576 pavelyakov 8
#define MASK_RAND 123456789
9
#define IQ_RAND 12773
10
#define IA_RAND 16807
11
#define IR_RAND 2836
12
#define IM_RAND 2147483647
13
#define AM_RAND (1./2147483647)
3067 leency 14
 
15
inline fastcall int random( ECX)
16
// get pseudo-random number - получить псевдослучайное число
17
{
18
  $push ebx
19
 
20
  $rdtsc        // eax & edx
21
  $xor eax,edx
22
  $not eax
23
 
5575 pavelyakov 24
  EBX = __generator;
3067 leency 25
  $ror ebx,3
26
  $xor ebx,0xdeadbeef
27
  EBX += EAX;
5575 pavelyakov 28
  __generator = EBX;
3067 leency 29
 
30
  EAX += EBX;
31
  EAX = EAX % ECX;
32
 
33
  $pop ebx
34
}
35
 
5582 pavelyakov 36
inline long unirand0(void)
5576 pavelyakov 37
{
38
	 long k,ans,tmp,save;
39
	 save = __generator;
40
	 __generator^=MASK_RAND;   /* avoid __generator==0 */
41
	 k=__generator/IQ_RAND;
42
	 tmp=__generator-k*IQ_RAND;
43
	 __generator*=IA_RAND*tmp;
44
	 __generator-=IR_RAND*k;
45
	 if(__generator<0) __generator+=IM_RAND;
46
	 if(save == __generator) return unirand0();
47
	 ans=__generator;
48
	 __generator^=MASK_RAND;   /* restore unmasked dummy */
49
	 return ans;
50
}
51
 
52
:long RAND_A,RAND_C,RAND_TMP;
5582 pavelyakov 53
inline long rand(signed long x1,x2)
5576 pavelyakov 54
{
55
	long tmp,xx;
56
	RAND_A = __generator;
57
	__generator = RAND_A*__generator+RAND_C;
58
	RAND_C = __generator^RAND_A;
59
	RAND_C>>=1;
60
	RAND_A<<=1;
61
	__generator^=RAND_A;
62
	xx=x2;
63
	if(x1<0)xx+=-x1;
64
	tmp = __generator%xx;
65
	if(tmp<0)tmp=-tmp;
66
	tmp+=x1;
67
	return tmp;
68
}
69
 
3067 leency 70
inline fastcall randomize()
5575 pavelyakov 71
// initialize random number __generator - инициализировать генератор случайных чисел
3067 leency 72
{
73
  asm
74
  {
75
    mov eax,3
76
    int 0x40
77
    ror eax,16
78
  }
5576 pavelyakov 79
  //if(EAX == __generator)return randomize();
5575 pavelyakov 80
  __generator = EAX;
81
}
82
 
5598 pavelyakov 83
#endif