Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рандом, Случайные числа 
:(
    Опции темы
FelikZ
Дата 20.3.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Цитата(v2v @  20.3.2008,  20:35 Найти цитируемый пост)
генерация holdrand посути и будет реализованным генератором в си. если тебе удастся найти алгоритм генерации , то возможно получится предсказывать  грядущие числа .
НО как уже было сказано выше генератор случ. чисел на си  зависит от текущего времени (как минимум с точностью до миллисекунд )., так что ты должен учесть тот момент, что твоё предсказание будет иметь место только для конкретного момента времени (с точностью до миллисекунд) , а ты не можешь точно определить когда генерируется переменная holdrand ..

p.s. при паралельном одновременном вызове сишной функции rand() ( 2 вызова в одну милисекунду) в паралельных потоках, генератор выдавал одинаковые числа!

Ну дело в том, что код который я привел выше, на сколько я и понимаю, и есть весь алгоритм образования случ. числа  smile , а если это так, то этот алгоритм зависит от времени лишь при инициализации рандома функцией srand(), а это делается 1раз в начале программы, если верить докам... То есть не важно когда вызывается rand() главное вычислить исходное значение "_holdrand", а оно по сути и есть то самое время(мс), когда запускается функция srand(). Но вот опять же вопрос, как сделать как бы "обратный алгоритм" зная "исходный алгоритм" для случ. чисел, чтобы из последовательности чисел (ну штук 30 вполне можно знать) сгенерированных rand(), получить заведомое "_holdrand". 


Цитата(v2v @  20.3.2008,  20:35 Найти цитируемый пост)
сгенерируй 2 * MAX_RAND чисел , сохрани их в файлик и посмотри как они меняются, или когда начнёт повторятся последовательность, начнёт ли.

В процессе smile


--------------------
user posted image
PM WWW ICQ Skype   Вверх
v2v
Дата 20.3.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



ты забываешь про функцию _getptd(); где и инициализируется holdrand  , там наверняка учитывается текущее время!


--------------------
PM   Вверх
FelikZ
Дата 20.3.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Цитата(maxim1000 @  20.3.2008,  20:40 Найти цитируемый пост)
берём первое значение

Проблема в том, что известеное значение не есть "реальное" случ. число, оно получено в результате формулы:
Код

(rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min)
Где 
range_min - минимальное генерируемое число
range_max - максимальное соответственно



--------------------
user posted image
PM WWW ICQ Skype   Вверх
v2v
Дата 20.3.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



там уже будет сложнее , она ссылается на виндовые библиотеке, которые не доступны в исходниках (


--------------------
PM   Вверх
FelikZ
Дата 20.3.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Цитата(v2v @  20.3.2008,  21:02 Найти цитируемый пост)
ты забываешь про функцию _getptd(); где и инициализируется holdrand  , там наверняка учитывается текущее время! 

неа, через отладку глянул, ф-я _getptd() просто возвращает указатель на структуру где содержится _holdrand... Реально единственное, что изменяет его это 
Код

((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff

в функции rand()
и значание текущего времени, при инициализации рандома в srand()

Добавлено через 3 минуты и 45 секунд
Цитата(v2v @  20.3.2008,  21:03 Найти цитируемый пост)
там уже будет сложнее , она ссылается на виндовые библиотеке, которые не доступны в исходниках ( 

хз меня пускает в отладку этих функций smile


--------------------
user posted image
PM WWW ICQ Skype   Вверх
xvr
Дата 20.3.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(v2v @ 20.3.2008,  21:02)
ты забываешь про функцию _getptd(); где и инициализируется holdrand  , там наверняка учитывается текущее время!

Бред.

Код

*_ptiddata _getptd(void) - get per-thread data structure for the current thread
*
*Purpose:
*
*Entry:
*       unsigned long tid
*
*Exit:
*       success = pointer to _tiddata structure for the thread
*       failure = fatal runtime exit
*
*Exceptions:
*
*******************************************************************************/

_ptiddata __cdecl _getptd (
        void
        )
{
        _ptiddata ptd;
        DWORD   TL_LastError;


        TL_LastError = GetLastError();
        if ( (ptd = FLS_GETVALUE(__tlsindex)) == NULL ) {
            /*
             * no per-thread data structure for this thread. try to create
             * one.
             */
            if ( ((ptd = _calloc_crt(1, sizeof(struct _tiddata))) != NULL) &&
                FLS_SETVALUE(__tlsindex, (LPVOID)ptd) ) {

                /*
                 * Initialize of per-thread data
                 */

                _initptd(ptd);

                ptd->_tid = GetCurrentThreadId();
                ptd->_thandle = (uintptr_t)(-1);
            }
            else
                _amsg_exit(_RT_THREAD); /* write message and die */
            }

        SetLastError(TL_LastError);


        return(ptd);
}

Всего лишь ссылка на глобальные данные thread'а, т.е. holdrand можно считать просто глобалом

PM MAIL   Вверх
v2v
Дата 20.3.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Код

                /*
                 * Initialize of per-thread data
                 */
                _initptd(ptd);

тут смотрел?


--------------------
PM   Вверх
Alexandr87
Дата 22.3.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 1
Всего: 39



Зачем мозги парить. Два раза вызовите srand с одним и тем же seed  и посмотрите на результаты вызова функции rand после этого.
PM Jabber   Вверх
xvr
Дата 22.3.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(v2v @ 20.3.2008,  23:07)
Код

                /*
                 * Initialize of per-thread data
                 */
                _initptd(ptd);

тут смотрел?

Смотрел конечно
Код

/***
*void _initptd(_ptiddata ptd) - initialize a per-thread data structure
*
*Purpose:
*       This routine handles all of the per-thread initialization
*       which is common to _beginthread, _beginthreadex, _mtinit
*       and _getptd.
*
*Entry:
*       pointer to a per-thread data block
*
*Exit:
*       the common fields in that block are initialized
*
*Exceptions:
*
*******************************************************************************/

void __cdecl _initptd (
        _ptiddata ptd
        )
{
        ptd->_pxcptacttab = (void *)_XcptActTab;
        ptd->_holdrand = 1L;

#ifdef _M_MRX000
        /*
         * MIPS per-thread data
         */
        ptd->_MipsPtdDelta =
        ptd->_MipsPtdEpsilon = -1L ;
#endif  /* _M_MRX000 */
}

Еще куда посмотреть? (Для справки: 1L - это константа  smile )

PM MAIL   Вверх
FelikZ
Дата 23.3.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Цитата(Alexandr87 @  22.3.2008,  09:50 Найти цитируемый пост)
Зачем мозги парить. Два раза вызовите srand с одним и тем же seed  и посмотрите на результаты вызова функции rand после этого. 

Результаты будут одинаковые. И как это поможет в поиске seed'а для множества чисел :?)


--------------------
user posted image
PM WWW ICQ Skype   Вверх
Alexandr87
Дата 23.3.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 1
Всего: 39



FelikZ, этот пост был к людям спорящим о зависимости выдаваемых чисел от вермени.
А так как он независим, тут прокатывает вариант предолженный maxim1000
PM Jabber   Вверх
v2v
Дата 23.3.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



ок. таки да к времени никакой привязки. но всё же чего то не хватает для предсказаний.
попытался написать вот такой кусочек кода:

Код

    unsigned long holder = 1L;
    unsigned int seed = 1;
    int r1;

    holder=(unsigned long)seed;
    srand(seed);
    for (int ii=0; ii<5; ii++)
    {
     printf("\nPredict  : %d", ( holder=holder*214013L+2531011L ) >> 16 & 0x7fff);
     r1=rand();
     printf("\nRandom: %d",r1);
    }


предсказания не верны. что не правильно?

Это сообщение отредактировал(а) v2v - 23.3.2008, 18:07


--------------------
PM   Вверх
maxdiver
Дата 23.3.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



У меня вывод совпадает
PM MAIL WWW ICQ   Вверх
v2v
Дата 23.3.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Правда? Прикольно!! smile
Какая ОСь? MVS используешь?
похоже, что рассчёт ещё и компиляторо зависимый.

Это сообщение отредактировал(а) v2v - 23.3.2008, 22:39


--------------------
PM   Вверх
maxdiver
Дата 24.3.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



VS2008
сомневаюсь, что от него что-то зависит.
если ты взял константы из исходников RTL _своего_ компилятора, то и у тебя должно работать.
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.