Вверх ↑
Этот топик читают: Гость
Ответов: 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
vip
#1.1контекстная реклама от партнеров
Ответов: 1376
Рейтинг: 197
#2: 2013-10-14 20:31:12 ЛС | профиль | цитата
Если присутствуют слова
alfazlo писал(а):
Вообщем нужно
или
mudfactory писал(а):
Есть задача
, то оформляйте свои сообщения в правильном разделе форума КуплюПродам

[offtop]Где Ravilr?[/offtop]
карма: 1

0
Ответов: 5
Рейтинг: 1
#3: 2013-10-14 20:43:46 ЛС | профиль | цитата
foksov писал(а):
Этими словами отступления я просто пояснил какую задачу я перед собой поставил, а далее спросил конкретно непонятные для меня вопросы. Не знал, что консультация платная, извините.
карма: 0

0
Главный модератор
Ответов: 2997
Рейтинг: 395
#4: 2013-10-14 20:49:32 ЛС | профиль | цитата
alfazlo, если приводите схему, то правилом хорошего тона было бы, чтобы после нажатия кнопки Push был виден неправильный результат, а Вы бы объяснили почему должен он быть другим и каким именно. А вообще: Почему-то не отвечают
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 1376
Рейтинг: 197
#5: 2013-10-14 20:55:09 ЛС | профиль | цитата
alfazlo писал(а):
Не знал, что консультация платная, извините.
у нас всё бесплатно, но только после соответствующего обращения, неприказного
карма: 1

0
Ответов: 5
Рейтинг: 1
#6: 2013-10-14 21:50:49 ЛС | профиль | цитата
Nic писал(а):

Схема: code_32020.txt
Пакет CNET. Hiasm v4.04 билд 185. OS Windows 7 Ultimate 64 bit.
После нажатия кнопки, элемент math выполняет операцию сдвига на 16 вправо числа -72774496, полученный результат выдает в text box.
Желаемый результат этой операции число 64425, а реальный -1111. 64425 потому что это число получается при чтении памяти в программе и я сам проделывал операцию сдвига в калькуляторе windows и потому, что программа выдает верный конечный результат только с этим значением.
На калькулятор я в данном случае мало рассчитываю т.к. сдвиги бывают разные, хотя он выдает нужное значение. Хотя, сдвиг вправо на 16 это то же самое что разделить на 2 в 16 степени тогда результат калькулятора -1110. Что делать, как жить?
upd: я понял почему так, я заполнял пространство нолями, а в действительности оно заполняется знаковым битом, то есть единицей, как получить без знаковый сдвиг? Я так пологаю нужно для 16 - 32 битов произвести, инверсию битов, или логическую операцию and 65535?
------------ Дoбавленo в 21.50:
foksov писал(а):
у нас всё бесплатно, но только после соответствующего обращения, неприказного

Просто Вы - программисты, чересчур щепетильный народ, можно и не придираться к мелочам. Хотя я пологаю дело в возрасте, лично мне даже неудобно писать в таком стиле.
карма: 0

0
файлы: 1code_32020.txt [453B] [231]
Ответов: 1376
Рейтинг: 197
#7: 2013-10-14 22:00:11 ЛС | профиль | цитата
alfazlo писал(а):
Просто Вы - программисты, чересчур щепетильный народ, можно и не придираться к мелочам
всё просто, не надо, на этом форуме, заставлять кого-либо что-либо делать, не принято у нас такого, все ваяют по желанию!
карма: 1

0
Ответов: 5
Рейтинг: 1
#8: 2013-10-14 22:07:11 ЛС | профиль | цитата
foksov писал(а):
всё просто, не надо, на этом форуме, заставлять кого-либо что-либо делать, не принято у нас такого, все ваяют по желанию!

Вы все надумали. Словами "Вообщем нужно реализовать код линейно конгруэнтного метода генерации псевдослучайных чисел по коду C." я не подразумевал, чтобы кто-то сделал это, а лишь пояснил задачу в которой у меня возникли затруднения по некоторым вопросам, которые я задал в не подобающем для этой конференции виде.
карма: 0

0
Ответов: 1376
Рейтинг: 197
#9: 2013-10-14 22:12:26 ЛС | профиль | цитата
alfazlo писал(а):
Вообщем нужно реализовать код линейно конгруэнтного метода генерации псевдослучайных чисел по коду C.
Ваше, примерное, озадачивание выложено на сайте, успокойтесь, люди подтянутся и решат, если им это будет интересно, Настоящий мужчина везде успевает не торопясь!
карма: 1

0
Главный модератор
Ответов: 2997
Рейтинг: 395
#10: 2013-10-14 23:47:39 ЛС | профиль | цитата
code_32021.txt
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
1
файлы: 1code_32021.txt [731B] [324]
Голосовали:alfazlo
Ответов: 5
Рейтинг: 1
#11: 2013-10-14 23:57:24 ЛС | профиль | цитата
Nic писал(а):
code_32021.txt

Спасибо работает!
карма: 0

0
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)