Случайные числа [ Vc++ ]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by GlOFF, 11 Jul 2007.

  1. ReanimatoR

    ReanimatoR Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    120
    Likes Received:
    118
    Reputations:
    34
    я всегда пишу генератор от функции timer();. цыфр добуя. Меняются быстро=) вот и генератор вам). на vb довел его до совершенства, как мне кажется.
     
  2. The_HuliGun

    The_HuliGun Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    191
    Likes Received:
    84
    Reputations:
    11
    Самый простой математический метод генерации псевдослучайных чисел есть линейный конгруэнтный метод. Следующее число последовательности расчетывается исходя из предыдущего по формуле
    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.
     
    3 people like this.
  3. Lamia

    Lamia Elder - Старейшина

    Joined:
    11 Jul 2007
    Messages:
    186
    Likes Received:
    77
    Reputations:
    -9
    У тя ж в джойнере полиформизм вроде присутствует!
    Значит там и генератор псевдослучайных чисел есть!
    Чем он тя не устраивает,не так случайно кости выпадают?
    Абсолютной случайности всеравно не получится!Если
    самому написать близкий к идеалу не получается,то приходится выбирать из чужих!
    Выбирай: 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
     
    1 person likes this.
  4. Lamia

    Lamia Elder - Старейшина

    Joined:
    11 Jul 2007
    Messages:
    186
    Likes Received:
    77
    Reputations:
    -9
    А я и не спорю!Именно случайных....
     
  5. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    Lamia В джойне случайные числа делаются стандартными методами! А вот иметь свой генератор приблеженный хотя бы к Random() для проектов на асме - это уже плюсег (тебе)!!!!

    P.S. Всем откликнувшимся спасибо, собрал много инфы и интересных идей!
     
    1 person likes this.
  6. Lamia

    Lamia Elder - Старейшина

    Joined:
    11 Jul 2007
    Messages:
    186
    Likes Received:
    77
    Reputations:
    -9
    Генератор не мой!А отсюда http://www.wasm.ru/article.php?article=virii_weapon
    На Wasm так же есть тестировщик ГПСЧ
     
    #26 Lamia, 13 Jul 2007
    Last edited: 13 Jul 2007
  7. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    У меня многопоточность......rand() используется раза три в функции SomeFunction


    ----каждый поток выглядит так
    OneThread()
    {
    while(i--)
    SomeFunction()
    }


    встречаются повторяющееся последовательности...че делать)

    использовал srand(time(0)) соответсвенно не пашет ...
     
    3 people like this.
  8. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    inv а ты инициализировал генератор, вот так:

    time_t MyTime;
    srand((unsigned)time_t(&MyTime)*1000000);

    ???
     
    1 person likes this.
  9. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    К черту rand вместе с crt. Напиши функцию, которая будет генерировать тебе псевдослучайное число с помощью GetTickCount(). Я выкладывал вроде пример в топике "с++ задай вопрос - получи ответ", глянь последние страницы.
     
  10. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    Ni0x

    у меня потоки......а там обращение ко времени получается к одному и тому же
    я делал так
    EnterCriticalSection(&cs);
    srnd();//моя srand
    ....обращение к песевдослу числу
    szRandUrl(login,passwd,url);

    не помогло


    Твое пробовал че-то вообще не покатило)))))))))
     
  11. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    У меня есть несколько потоков
    в каждом потоке просто выводятся рандомные строчки
    потоки работают одновременно
    Мне нужно чтобы ВСЕ строчки были разные....пока что не получилось.

    едиснтвенное пока что пришло в голову это присабачивать к srand номер потока.
     
  12. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    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;
    }
    
     
    #32 Ni0x, 7 Oct 2007
    Last edited: 7 Oct 2007
  13. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58


    одинаковые числа=\с мессаджами не одинаковые само собой так как там время тратится на окошки
    смысл не в этом...смысл во времени
    может использовать другую псевдослучайную посл...

    *********
    проблему решил,использовал псевдо случпоследовательность(не зависит от времени) ,иницилизировал временем.
     
    #33 inv, 8 Oct 2007
    Last edited: 8 Oct 2007
    1 person likes this.
  14. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Алгоритм такой должен быть - rand_init() просто сохраняет в переменной значение GetTickCount(), а далее каждый раз, вызваная rand()-ф-ия искривляет его, например, умножает на 0xf25a0cb2 и т.п. и возвращает. Тогда значения будут разными. А у тебя зачем-то на единицу увеличивается, а потом от нее считается. Можно было бы додуматься. И ещё, не юзайте там лишнего всяких умножений, а то потом rand()-ф-ии будут занимать времени больше, чем все потоки вместе взятые
    О чем тут ещё можно говорить?
     
    1 person likes this.
  15. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Много всяких случайностей еще можно придумать кроме времени для инициализации: состояние памяти в каком-нибудь месте, уровень входного звукового сигнала, загруженность процессора, количество занятой оперативной памяти и т.д. Можно это все как-то комбинировать и получить генератор больменее случайных чисел без всяких железяк. Только тогда надо будет не инкрементить rand_seed (или умножать его на что-то там и т.д.), а так же его постоянно откуда-то рандомно получать. Хотя функция тогда будет занимать много времени...

    Great: Ммда ))) ZaCo, +1
     
    #35 DWORD, 8 Oct 2007
    Last edited by a moderator: 12 Oct 2007
  16. NetMan

    NetMan Elder - Старейшина

    Joined:
    9 Feb 2004
    Messages:
    121
    Likes Received:
    37
    Reputations:
    34
    1 person likes this.
  17. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    Kez, алгоритм не мой, я просто разместил объяву. Согласен - нетемовый, исправим.
     
  18. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    я же написал в первом посте этой теме - главное это ЧТО в СВОЕЙ программе ВЫ считаете случайным числом. не понимаю, зачем нужно формирование "случайной" последовательности наиболее близкой к жизненной, человеку, скорее всего, не занимающимся созданием ключей для шифрования? и то - взять тот же стеганос, он сам просит пользователя рандомно повозить мышкой по экрану или постучать по клавиатуре:)
    для игр - существуют алгоритмические способы формирования таких последовательностей с равномерным распределением значений по множеству int чисел, все это описано у кнута.
    --
    куда интереснее было бы почитать про анализ алгоритмически-построенной последовательности на "случайность" и про возможное предположение о продолжении последовательности.
     
    1 person likes this.
  19. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Псевдослучайное число это значит число, которое на самом деле не случайное и при знании алгоритма функции rand и начальных условий можно восстановить всю цепочку вызовов этой функции, а если знать как окргуляли эти числа, то случайными они уже никак не будут.
    А случайные числа это те, у которых практически невозможно предсказать начальные условия (в худшем случае) или те, у которых вообще нет начальных условий (т.е. с учетом состояния рандомизирующих элементов генерируется всякое случайное число), разумеется в большинстве случаев это совершенно ненужно, я даже плохо представляю когда это может понадобиться.