Подскажите, плс., алгоритм формирования псевдослучайной последовательности числел в заданном пределе значений ("от" и "до"). Смотрел какой-то пример, понял, что исходной точкой является какой-то параметр, связанный с временем, н-р GetTickCount, только не разобрал границу м/у генерацией числа и самой программой.. Мне нужно получить от 10 до 1000 таких значений за короткий интервал времени, чтобы они достаточно равномерно были распределены. Может у кого есть готовый, поделитесь.. Высоких требований не предъявляю (MASM32), единственное 1000 штук надо сгенерировать в доли секунды. Надо это в простой логической игре.
На моём сайте (www.codexxi.com) есть такой AsmDev, в приложении к нему есть старые (16-бит DOS) исходные коды. Там должен быть такой генератор. Переведи его на 32-бит - замени регистры и вмето миллисекунд от DOS бери результат от GetTickCount().
http://www.wasm.ru/forum/index.php?action=vthread&forum=6&topic=12953 http://sl0n.dzena.net/t/prng.txt http://www.nf-team.org/drmad/zf/zf5/zf5_022.htm
Всем баааальшое спасибо! Буду изучать всё, что вы тут написали. Кое-что нашел и я в своём архивчике исходников. Пишите ещё, тема пока не закрыта.
Vasil И получишь строго неубывающую последовательность. Блестящий совет Послушайте, что умный DEN говорит, хоть это и редко с ним бывает
Ну ладно, не используй команду счётчика тактов (edx:eax) rdtsc (упс, я слово "последовательность" упустил)
Ну почему же не использовать rdtsc в качестве стартового псевдослучайного числа, а последовательность, например, формировать по алгоритму "Xorshift - 128". Это по-моему даже не хуже, чем GetTickCount? Я видел один алгоритм, где в инициализации ГПСЧ использована rdtsc. Вот он (nrand.asm): Код (Text): ; ###################################################################### ### ; ; Park Miller random number algorithm. ; ; Written by Jaymeson Trudgen (NaN) ; Optimized by Rickey Bowers Jr. (bitRAKE) ; ; ###################################################################### ### ; modified by S.T.A.S. align 16 nrandom proc base:DWORD pop EAX ; get return address pop EBX ; get arg push EAX nrandom endp nrandomd PROC ; EBX= base mov eax, nrandom_seed xor edx, edx mov ecx, 127773 div ecx mov ecx, eax mov eax, 16807 mul edx mov edx, ecx mov ecx, eax mov eax, 2836 mul edx sub ecx, eax xor edx, edx mov eax, ecx mov nrandom_seed, ecx div EBX;base mov eax, edx ret nrandomd ENDP nseed proc ;TheSeed:DWORD RTDATA align dword nrandom_seed dd 0 .code ; mov eax, TheSeed rdtsc mov nrandom_seed, eax ret nseed endp Впрочем, не в пользу rdtsc ещё и то, что инструкция начинает поддерживаться начиная только с P5, а многие привыкли писать win32-программы, ограничившись инструкциями .386 / .386P