я всегда пишу генератор от функции timer();. цыфр добуя. Меняются быстро=) вот и генератор вам). на vb довел его до совершенства, как мне кажется.
Самый простой математический метод генерации псевдослучайных чисел есть линейный конгруэнтный метод. Следующее число последовательности расчетывается исходя из предыдущего по формуле x2 = (a*x1 + c) mod m где a,c,m параметры последовательности, а mod - остача от деления. Есть теорема, выполнение условий которой гарантирует появление последовательности с полным периодом, т. е. псевдослучайные числа будут набирать всех значений от 0 до m: 1. c и m взаимно просты. 2. a - 1 кратно p для всех простых p — делителей m; 3. a - 1 кратно 4, если m кратно 4. Если надо получить псевдослучайное число в интервале от 0 до 1, тогда результат делят на m.
У тя ж в джойнере полиформизм вроде присутствует! Значит там и генератор псевдослучайных чисел есть! Чем он тя не устраивает,не так случайно кости выпадают? Абсолютной случайности всеравно не получится!Если самому написать близкий к идеалу не получается,то приходится выбирать из чужих! Выбирай: http://vx.org.ua/29a/main.html Может что и нароеш..там и си и асм ;by Slon brandom32: push edx ecx xor edx,edx imul eax,eax,100 push eax call random32 pop ecx div ecx xchg eax,edx xor edx,edx mov ecx,100 div ecx pop ecx edx ret random32: push edx ecx db 0fh,031h rcl eax,2 add eax,12345678h random_seed = dword $-4 adc eax,esp xor eax,ecx xor [random_seed],eax add eax,[esp-8] rcl eax,1 pop ecx edx ret
Lamia В джойне случайные числа делаются стандартными методами! А вот иметь свой генератор приблеженный хотя бы к Random() для проектов на асме - это уже плюсег (тебе)!!!! P.S. Всем откликнувшимся спасибо, собрал много инфы и интересных идей!
Генератор не мой!А отсюда http://www.wasm.ru/article.php?article=virii_weapon На Wasm так же есть тестировщик ГПСЧ
У меня многопоточность......rand() используется раза три в функции SomeFunction ----каждый поток выглядит так OneThread() { while(i--) SomeFunction() } встречаются повторяющееся последовательности...че делать) использовал srand(time(0)) соответсвенно не пашет ...
inv а ты инициализировал генератор, вот так: time_t MyTime; srand((unsigned)time_t(&MyTime)*1000000); ???
К черту rand вместе с crt. Напиши функцию, которая будет генерировать тебе псевдослучайное число с помощью GetTickCount(). Я выкладывал вроде пример в топике "с++ задай вопрос - получи ответ", глянь последние страницы.
Ni0x у меня потоки......а там обращение ко времени получается к одному и тому же я делал так EnterCriticalSection(&cs); srnd();//моя srand ....обращение к песевдослу числу szRandUrl(login,passwd,url); не помогло Твое пробовал че-то вообще не покатило)))))))))
У меня есть несколько потоков в каждом потоке просто выводятся рандомные строчки потоки работают одновременно Мне нужно чтобы ВСЕ строчки были разные....пока что не получилось. едиснтвенное пока что пришло в голову это присабачивать к srand номер потока.
inv, надеюсь я правильно тебя понял. Code: #include <windows.h> unsigned long rs_randseed; void _srand() { rs_randseed = GetTickCount(); } unsigned long _rand() { rs_randseed++; return (rs_randseed*0xF02CE551) + 0x7FF2742B; } unsigned int __stdcall Base(PVOID pArg) { int a = 0; char pa[12]; _srand(); a=_rand() % 1000; itoa(a, pa, 10); MessageBox(0, pa, "Hi", 0); return 0; } int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HANDLE hHan[9]; for(int i; i<9; i++) { hHan[i] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Base, 0, 0, 0); } WaitForMultipleObjects(9, hHan, TRUE, INFINITE); for(int j; j<9; j++) { CloseHandle(hHan[j]); } return 0; }
одинаковые числа=\с мессаджами не одинаковые само собой так как там время тратится на окошки смысл не в этом...смысл во времени может использовать другую псевдослучайную посл... ********* проблему решил,использовал псевдо случпоследовательность(не зависит от времени) ,иницилизировал временем.
Алгоритм такой должен быть - rand_init() просто сохраняет в переменной значение GetTickCount(), а далее каждый раз, вызваная rand()-ф-ия искривляет его, например, умножает на 0xf25a0cb2 и т.п. и возвращает. Тогда значения будут разными. А у тебя зачем-то на единицу увеличивается, а потом от нее считается. Можно было бы додуматься. И ещё, не юзайте там лишнего всяких умножений, а то потом rand()-ф-ии будут занимать времени больше, чем все потоки вместе взятые О чем тут ещё можно говорить?
Много всяких случайностей еще можно придумать кроме времени для инициализации: состояние памяти в каком-нибудь месте, уровень входного звукового сигнала, загруженность процессора, количество занятой оперативной памяти и т.д. Можно это все как-то комбинировать и получить генератор больменее случайных чисел без всяких железяк. Только тогда надо будет не инкрементить rand_seed (или умножать его на что-то там и т.д.), а так же его постоянно откуда-то рандомно получать. Хотя функция тогда будет занимать много времени... Great: Ммда ))) ZaCo, +1
я же написал в первом посте этой теме - главное это ЧТО в СВОЕЙ программе ВЫ считаете случайным числом. не понимаю, зачем нужно формирование "случайной" последовательности наиболее близкой к жизненной, человеку, скорее всего, не занимающимся созданием ключей для шифрования? и то - взять тот же стеганос, он сам просит пользователя рандомно повозить мышкой по экрану или постучать по клавиатуре для игр - существуют алгоритмические способы формирования таких последовательностей с равномерным распределением значений по множеству int чисел, все это описано у кнута. -- куда интереснее было бы почитать про анализ алгоритмически-построенной последовательности на "случайность" и про возможное предположение о продолжении последовательности.
Псевдослучайное число это значит число, которое на самом деле не случайное и при знании алгоритма функции rand и начальных условий можно восстановить всю цепочку вызовов этой функции, а если знать как окргуляли эти числа, то случайными они уже никак не будут. А случайные числа это те, у которых практически невозможно предсказать начальные условия (в худшем случае) или те, у которых вообще нет начальных условий (т.е. с учетом состояния рандомизирующих элементов генерируется всякое случайное число), разумеется в большинстве случаев это совершенно ненужно, я даже плохо представляю когда это может понадобиться.