На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Генерация случайных чисел
    Тут вдруг захотелось сделать генератор (псевдо)случайных чисел.
    Подумал, и понял, что абсолютно не знаю (даже не представляю), КАК заставить комп выбрать случайное число, например, в промежутке от 0 до 10... :o
    Но от этого стало еще интереснее... ;)
    Мож кто знает алгоритм генератора случ. чисел?..
    или какие-нить мысли?..
      Равномеpное pаспpеделение от 0 до 1. Метод вычетов. Он же метод Лемеpа.

      === Cut ===
      struct time t;              // стpyктypа вpемени
      static long x;              // для генеpатоpа

      //----------------------------------------------------------------------------
      // Инициализация генеpатоpа слyчайных чисел
      double Randomize()
      {
       gettime(&t);
       x=t.ti_sec;
      }

      //----------------------------------------------------------------------------
      // Генеpатоp слyчайных чисел
      double Rnd()
      {
       const a=13;
       const c=15;
       const long M=32768;

       x=(a*x+c)\%M;
       return (double)x/M;
      }
      === Cut ===

      Можешь поигpаться с константами...
        А можно в 2х словах поподробней?..
        Я так понял, просто за переменную Х берецца значение секунд в данный момент и дальше по формуле...
          В общем, тебе нужно оттолкнуться хоть от чего-то, что невозможно предсказать. Скажем, невозможно предсказать, в какой момент юзер запустит твою прогу, и когда она дойдёт до куска кода, который генерит "псевдо"-случайное число. Невозможно предсказать, что происходит в помещении, где сидит юзер, поэтому можно записать что-нибудь со звуковой карты (но это уже на крайний случай), посчитать хеш от этих данных и пользовать как случайное число. Короче, варианты есть.. ;)
            Берешь несколько указателей.
            Передвигаешь их на значение текущего времени в любую сторону.
            Читаешь что там есть.
            Так пару раз.
            Все это суммируешь, возводишь в куб, берешь остаток от деления на 53.
            сдвигаешь на текущую дату в зависимости от времени суток.
            Берешь логарифм по основаниню 5.3
            Перешь целую часть.
            И.т.д. пока не закончится воображение.
            Но в любом случае случайной величины ты не получишь.
            Можно конечно заставить юзера подергать мышь, и постучать по клаве, как в ПЖП.
            Тога будут действительно случайные велечины. А с ними можно для верности провести
            все вышеперечисленое.
            Удачи.

            P.S. а вышеприведенный генератор выдает всего 60 различных последовательностей.
            Сообщение отредактировано: Muran -
              Спасиба, буду пробовать...  :)
                Цитата Muran, 03.05.02, 23:23:48
                Можно конечно заставить юзера подергать мышь, и постучать по клаве, как в ПЖП.
                Тога будут действительно случайные велечины.


                Точнее было раньше:
                Цитата
                Но в любом случае случайной величины ты не получишь.


                Подумай - что за распределение будет у такой юзеровской случайной величины - у большинства генераторов и то лучше. Тем более, человек произвольно не способен генерировать равномерно-распределенные (равномерно - здесь - с каким-нибудь приличным распределением - нормальным, например) - не помню где, видел ссылку на программу, предсказывающую "случайный" выбор человека с вероятностью больше обычной (т.е. для выбора из двух значений, вероятность угадывания приближается к 0,5 только если человек пользуется внешним генератором и становится больше 0,5, если человек пытается брать числа "из головы")
                Сообщение отредактировано: volatile -
                  #include <stdlib.h>
                  #include <stdio.h>
                  #include <time.h>

                  void main( void )
                  {
                    int i;
                    srand( (unsigned)time( NULL ) );
                       printf( " - \%d\n  - ", rand()\%10);
                  }

                  Так не годиться?
                    2Faust
                    А какая разница по какому закону распределяется?
                    человеческое распредление величины гауссово, так ведь линейную то виг сделаешь.
                    Их и в природе не бывает.

                      Цитата Muran, 04.05.02, 11:32:34
                      ...человеческое распредление величины гауссово...

                      ::)Напоминает "Кесарю - кесарево..." или "сочти это число, ибо это число человеческое..."
                      Я к тому, что псевдослучайность - единственное, что доступно человеку, standalone - без помощи наблюдения за природой.
                        Люди атас !!! срочно нужен генератор сл чисел для глобальных переменных .... помогите если сможете .Заранее спасибо   ::)
                          А еще - Д. Кнут "Искусство программирования", том 2. Там целая глава посвящена генерации псевдослучайных последовательностей.
                            Разница какой тип распределения в том, что:
                            1. Если вы хотите смоделировать как упадет монетка то вам нужно равномерное распределение. Т.е. событие "решко" должно иметь ту же вероятность произойти, что и событие "орел".
                            2. Если вы хотите предсказать отказ устройства то вам понадобится экспонециальное распределение.
                            3. В мат. статистике и термодинамике часто используют нормальное распределение ну так далие.
                            Но все распределения можно сгенерировать с помощью равномерно распределенной случайной величины.
                            Что же касается алгоритма то можно посоветовать метод середины квадрата:
                            X(n) = 0,A(1) A(2) ... A(2k)
                            X(n)^2 = 0,B(1) B(2) ... B(4k)
                            X(n+1) = 0,B(k+1) ...B(3k)
                              Господа, очень интересно было бы увидеть код Метода вычетов (он же метод Лемера) на языке Delphi. Кто-нибудь сможет помочь? Спасибо.
                                методов генерации последовательности псевдослучайных чисел очень много:):):) у нас по ним счас как раз курс читается (ну почти по ним)

                                если интересуует могу доку зафигачить:)

                                еще в тему: есть работы по генеррации таких чисел на основании шума, полученного от микрофона звуковухи.
                                и есть какая-то мелкософтовская фича для получения числа основываясь на температуре проца (которая до десятитысячных считается) только этот очень медленный способ
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0923 ]   [ 15 queries used ]   [ Generated: 5.10.26, 23:54 GMT ]