На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Нужна функция - генератор случайных чисел на С
    Студия 2003, проект старый на MFC.

    Нужен генератор случайных чисел для получения случайного ключа.
    srand(time(NULL)) - для rand не подходит - время запуска программы общеизвестно.
    Много пересмотрел источников, есть или огромные библиотеки, или решения на новых версиях С++
    Возможно у кого то в примерах есть готовый вариант такой функции?
      Общего решения не существует. Любой алгоритм является формальной последовательностью действий, поэтому априори неслучаен. Чтобы выход алгоритма мог быть недетерминированным, он должен основываться на недетерминированных входах. Если в системе не существует подобных источников данных, задача нерешаема.
      В той или иной системе часто можно найти подобные источники, но они сильно зависят от самой системы. Например, в процессорах Intel есть инструкции RDRAND и RDSEED, работают ужасно медленно, но очень качественно. Имеются с 3-го поколения процессоров iCore. В любом случае их наличие можно проверить через CPUID. Но это не C, конечно, это уже ассемблер. Также можно попытаться поиграться с неопределённым поведением, например, заглянув в неинициализированные автоматические переменные или просто поглубже в стек, но чем это чревато, объяснять, думаю, излишне. Под Windows можно поиграться с сильно многопоточным кодом, где потоков гораздо больше процессорных ядер. Например, отслеживая порядок активизации потоков, основываясь т.о. на недокументированности планировщика потоков ОСи, но недокументированность всё ж не недетерминированность.
      Самый ИМХО разумный выбор – https://www.random.org, но это уже не столько C, сколько Web.
        Цитата MaIron @
        время запуска программы общеизвестно.

        А время запуска процессора? Может RDTSC подойдет?
          Цитата shm @
          Цитата MaIron @
          время запуска программы общеизвестно.

          А время запуска процессора? Может RDTSC подойдет?

          О! То, что нужно! Вызов модуля осуществляется на удалённой машине. Для текущей задачи, этого более чем достаточно.
          И напрямую через ASM вставку на MFC проекте пошло!

          ExpandedWrap disabled
            unsigned __int64 rdtscval;
                __asm
                {
                    rdtsc
                    lea ebx, rdtscval
                    mov [ebx], eax
                    mov [ebx+4], edx
                }
            CString str;
            str.Format(_T("%I64u"), rdtscval);


          shm и Qraizer Спасибо!!!
          Сообщение отредактировано: MaIron -
            Цитата MaIron @
            Студия 2003, проект старый на MFC.

            Нужен генератор случайных чисел для получения случайного ключа.
            srand(time(NULL)) - для rand не подходит - время запуска программы общеизвестно.
            Много пересмотрел источников, есть или огромные библиотеки, или решения на новых версиях С++
            Возможно у кого то в примерах есть готовый вариант такой функции?

            Для генерации КЛЮЧЕЙ ф-я rand в принципе не подходит. Последовательность генерируемая rand восстанавливается полностью по нескольким значениям.
            Всё равно srand со случайным аргументом или нет.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0268 ]   [ 16 queries used ]   [ Generated: 18.04.24, 15:31 GMT ]