Вверх ↑
Ответов: 5
Рейтинг: 1
#1: 2013-10-14 19:31:19 ЛС | профиль | цитата
Вообщем нужно реализовать код линейно конгруэнтного метода генерации псевдослучайных чисел по коду C.

unsigned long lo, hi, ll, lh, hh, hl;
unsigned long result;
lo = IL_StandardRandom_seed & 0xffff;
hi = IL_StandardRandom_seed >> 16;
IL_StandardRandom_seed = IL_StandardRandom_seed * IL_RMULT + 12345;
ll = lo * (IL_RMULT & 0xffff);
lh = lo * (IL_RMULT >> 16);
hl = hi * (IL_RMULT & 0xffff);
hh = hi * (IL_RMULT >> 16);
result = ((ll + 12345) >> 16) + lh + hl + (hh << 16);
result &= ~LONG_MIN;
Вот такие не сложные операции, только вот некоторые значения не совпадают. Я так понимаю из-за типов данных, я просто не знаком с ЯП, только скриптовый язык игрового движка, но можно ли в hiasm работать побитово с числами set/clear/test? В пакете Windows у меня например при перемножении двух чисел появляется не правильное значение при переполнении. В пакете CNET с этим проблем нет, а вот со сдвигом вправо на 16 вообще не то выдает в некоторых случаях, например:
-72774496 вот это число я в калькуляторе сдвигаю получается 64425 - правильное значение, обнуляю биты 0 - 16, а биты 16 - 32 сдвигаю на их место, в скриптовом движке я это решал путем чтения 2 байт памяти по адресу переменной. Можно ли как-то типы данных регулировать, или конвертер 32 bit to 16 сначала или с конца?
Make(cnet)
ver(4.04 build 185)
Add(EntryPoint,2953706,21,105)
{
Width=637
Height=192
}
Add(TextBox,6998820,161,63)
{
Left=90
Top=20
Width=145
Text="seed"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(TextBox,6352428,294,63)
{
Left=90
Top=75
Width=145
Text="hi"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(Button,2580392,98,161)
{
Left=245
Top=20
Point(onClick)
link(onClick,1600566:doOperation,[])
}
Add(TextBox,11645623,217,63)
{
Left=90
Top=50
Width=145
Text="lo"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(Math,1600566,161,161)
{
OpType=7
Op2=Integer(65535)
TypeOp1=2
TypeOp2=2
link(onResult,12345011:doValue,[])
link(Op1,12844820:Var1,[(167,138)])
}
Add(GlobalVar,12345011,210,161)
{
Name="lo"
link(onValue,121369:doEvent1,[])
}
Add(GlobalVar,641593,448,252)
{
Name="hl"
link(onValue,1530207:doOperation,[])
}
Add(GlobalVar,15966009,336,252)
{
Name="lh"
link(onValue,10100503:doOperation,[])
}
Add(GlobalVar,4587824,210,252)
{
Name="ll"
link(onValue,16658258:doOperation,[])
}
Add(GlobalVar,10868680,350,168)
{
Name="hi"
link(onValue,4511814:doEvent1,[])
}
Add(GlobalVar,9287824,581,252)
{
Name="hh"
link(onValue,7290904:doOperation,[(622,258)(622,364)(121,364)(121,391)])
}
Add(TextBox,9034656,133,308)
{
Left=245
Top=50
Width=140
Text="ll"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(TextBox,7132832,301,308)
{
Left=245
Top=75
Width=140
Text="lh"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(TextBox,5507111,413,308)
{
Left=245
Top=100
Width=140
Text="hl"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(TextBox,12420187,525,308)
{
Left=245
Top=125
Width=140
Text="hh"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(Hub,4511814,392,168)
{
link(onEvent1,6352428:doText,[(416,174)(416,118)(289,118)(289,69)])
link(onEvent2,16175012:doOperation,[])
}
Add(Hub,16533708,196,525)
{
link(onEvent1,772104:doOperation,[])
link(onEvent2,8787442:doText,[(222,538)(222,566)(135,566)(135,594)])
}
Add(Hub,11380169,238,385)
{
link(onEvent1,8202892:doOperation,[])
link(onEvent2,15713555:doText,[(264,398)(264,430)(181,430)(181,461)])
}
Add(Hub,6875983,546,252)
{
link(onEvent1,9287824:doValue,[])
link(onEvent2,12420187:doText,[(572,265)(572,289)(513,289)(513,314)])
}
Add(Hub,2463987,420,252)
{
link(onEvent1,641593:doValue,[])
link(onEvent2,5507111:doText,[(446,265)(446,293)(401,293)(401,314)])
}
Add(Hub,10790715,301,252)
{
link(onEvent1,15966009:doValue,[])
link(onEvent2,7132832:doText,[(326,271)(326,289)(289,289)(289,314)])
}
Add(Hub,8425732,546,175)
{
link(onEvent1,6998820:doText,[(570,181)(570,52)(149,52)(149,69)])
link(onEvent2,5736787:doOperation,[(572,188)(572,227)(124,227)(124,258)])
}
Add(Hub,9100775,175,252)
{
link(onEvent1,4587824:doValue,[])
link(onEvent2,9034656:doText,[(194,265)(194,295)(128,295)(128,314)])
}
Add(Hub,121369,259,161)
{
link(onEvent1,11645623:doText,[(281,167)(281,118)(212,118)(212,69)])
link(onEvent2,9912808:doOperation,[])
}
Add(Math,9912808,301,168)
{
OpType=6
Op2=Integer(16)
TypeOp1=2
TypeOp2=2
link(onResult,10868680:doValue,[])
link(Op1,609273:Var2,[])
}
Add(GetDataEx,12844820,161,133)
{
link(Data,6998820:Text,[])
}
Add(Math,16175012,441,175)
{
OpType=2
Op2=Integer(1103515245)
TypeOp1=2
TypeOp2=2
link(onResult,5495095:doOperation,[])
link(Op1,609273:Var3,[(447,138)])
}
Add(GetDataEx,609273,301,133)
{
Angle=3
link(Data,12844820:Var3,[])
}
Add(Math,5495095,497,175)
{
Op2=Integer(12345)
TypeOp1=2
TypeOp2=2
link(onResult,8425732:doEvent1,[])
link(Op1,16175012:Result,[(503,163)(483,163)(483,216)(447,216)])
}
Add(Math,5736787,133,252)
{
OpType=2
Op2=Integer(20077)
TypeOp1=2
TypeOp2=2
link(onResult,9100775:doEvent1,[])
link(Op1,5523599:Var1,[(139,214)])
}
Add(Math,16658258,259,252)
{
OpType=2
Op2=Integer(16838)
TypeOp1=2
TypeOp2=2
link(onResult,10790715:doEvent1,[])
link(Op1,5523599:Var3,[(265,214)])
}
Add(GetDataEx,5523599,210,209)
{
link(Data,12345011:Var,[])
}
Add(Math,10100503,378,252)
{
OpType=2
Op2=Integer(20077)
TypeOp1=2
TypeOp2=2
link(onResult,2463987:doEvent1,[])
link(Op1,4340989:Var2,[])
}
Add(Math,1530207,497,252)
{
OpType=2
Op2=Integer(16838)
TypeOp1=2
TypeOp2=2
link(onResult,6875983:doEvent1,[])
link(Op1,4340989:Var3,[(503,238)])
}
Add(GetDataEx,4340989,378,233)
{
Angle=3
link(Data,10868680:Var,[(356,238)])
}
Add(Math,7290904,133,385)
{
Op2=Integer(12345)
TypeOp1=2
TypeOp2=2
link(onResult,15152305:doOperation,[])
link(Op1,4587824:Var,[(139,353)(216,353)])
}
Add(Math,15152305,189,385)
{
OpType=6
Op2=Integer(16)
TypeOp1=2
TypeOp2=2
link(onResult,11380169:doEvent1,[])
link(Op1,7290904:Result,[(195,373)(176,373)(176,429)(139,429)])
}
Add(TextBox,15713555,189,455)
{
Left=400
Top=50
Width=175
Text="op ll"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(TextBox,8787442,147,588)
{
Left=400
Top=75
Width=175
Text="op hh"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(TextBox,10810639,259,588)
{
Left=400
Top=100
Width=175
Text="summ"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(GlobalVar,14210675,511,389)
{
Name="x1"
link(onValue,16447536:doOperation,[(561,395)(561,391)])
}
Add(Math,8202892,329,385)
{
TypeOp1=2
TypeOp2=2
link(onResult,4063420:doOperation,[])
link(Op1,15152305:Result,[(335,373)(286,373)(286,440)(195,440)])
link(Op2,15966009:Var,[])
}
Add(Math,4063420,440,385)
{
TypeOp1=2
TypeOp2=2
link(onResult,14210675:doValue,[(481,391)(481,395)])
link(Op1,8202892:Result,[(446,373)(372,373)(372,430)(335,430)])
link(Op2,641593:Var,[(453,325)(454,325)])
}
Add(Math,16447536,581,385)
{
OpType=5
Op2=Integer(16)
TypeOp1=2
TypeOp2=2
link(onResult,1313828:doValue,[(625,391)(625,504)(113,504)(113,535)])
link(Op1,9287824:Var,[])
}
Add(Math,772104,245,525)
{
TypeOp1=2
TypeOp2=2
link(onResult,2619687:doEvent1,[])
link(Op1,1313828:Var,[(251,513)(139,513)])
link(Op2,14210675:Var,[(258,514)(517,514)])
}
Add(GlobalVar,1313828,133,529)
{
Name="x2"
link(onValue,16533708:doEvent1,[(173,535)(173,531)])
}
Add(Hub,2619687,308,525)
{
link(onEvent1,6055031:doValue,[(332,531)(332,535)])
link(onEvent2,10810639:doText,[(334,538)(334,566)(247,566)(247,594)])
}
Add(GlobalVar,6055031,357,529)
{
Name="Rez"
link(onValue,5074041:doOperation,[(418,535)(418,573)])
}
Add(TextBox,14778460,525,616)
{
Left=400
Top=125
Width=175
Text="Rez"
Lines=[]
Point(doText)
Point(Text)
Point(data)
}
Add(Math,5074041,448,567)
{
OpType=7
Op2=Integer(2147483647)
TypeOp1=2
TypeOp2=2
link(onResult,7961663:doEvent1,[])
link(Op1,6055031:Var,[(454,553)(363,553)])
}
Add(Hub,7961663,504,567)
{
link(onEvent2,14778460:doText,[(530,580)(530,601)(506,601)(506,622)])
}
И еще главный вопрос, скорость выполнения, именно по этой причине я и пытаюсь сделать программу в hiasm надеюсь она будет генерировать быстрее, а в общем скрипт не плохо справляется с задачей, но все же долго. Программа принимает начальное значение, создает текстовый файл с названием этого начального значенияя и в этот файл вторым циклом записывает миллион значений, потом закрывает файл,прибавляет к стартовому значению единицу создает новый файл и так в цикле 1 файл пишется 2-4 секунды, нужно побыстрее :/
карма: 0

0