Subversion Repositories Kolibri OS

Rev

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