Тема: Rnd без Rnd!?
Показать сообщение отдельно
Старый 19.08.2009, 01:36   #3
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений
(для 6,854 пользователей)
Ответ: Rnd без Rnd!?

Ненужное потёр.
brl.random
Global rnd_state=$1234
Const RND_A=48271,RND_M=2147483647,RND_Q=44488,RND_R=3399


Function RndFloat#()
    
rnd_state=RND_A*(rnd_state Mod RND_Q)-RND_R*(rnd_state/RND_Q)
    If 
rnd_state<0 rnd_state=rnd_state+RND_M
    
Return (rnd_state $ffffff0) / 268435456#  'divide by 2^28
End Function


Function 
RndDouble!()
    Const 
TWO27! = 134217728.0
    
Const TWO29! = 536870912.0

    rnd_state
=RND_A*(rnd_state Mod RND_Q)-RND_R*(rnd_state/RND_Q)
    If 
rnd_state<0 rnd_state=rnd_state+RND_M
    Local r_hi
! = rnd_state & $1ffffffc

    rnd_state
=RND_A*(rnd_state Mod RND_Q)-RND_R*(rnd_state/RND_Q)
    If 
rnd_state<0 rnd_state=rnd_state+RND_M
    Local r_lo
! = rnd_state & $1ffffff8

    
Return (r_hi r_lo/TWO27)/TWO29
End 
Function

Function 
Rnd!( min_value!=1,max_value!=)
    If 
max_value>min_value Return RndDouble()*(max_value-min_value)+min_value
    
Return RndDouble()*(min_value-max_value)+max_value
End 
Function

Function 
Randmin_value,max_value=)
    
Local range=max_value-min_value
    
If range>Return IntRndDouble()*(1+range) )+min_value
    
Return IntRndDouble()*(1-range) )+max_value
End 
Function

Function 
SeedRndseed )
    
rnd_state=seed & $7fffffff  
    
If rnd_state=Or rnd_state=RND_M rnd_state=$1234
End 
Function

Function 
RndSeed()
    Return 
rnd_state
End 
Function 
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
h1dd3n (19.08.2009), Harter (19.08.2009)