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

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

                                еще в тему: есть работы по генеррации таких чисел на основании шума, полученного от микрофона звуковухи.
                                и есть какая-то мелкософтовская фича для получения числа основываясь на температуре проца (которая до десятитысячных считается) только этот очень медленный способ
                                  Цитата kozza, 22.03.03, 11:36:31
                                  Господа, очень интересно было бы увидеть код Метода вычетов (он же метод Лемера) на языке Delphi. Кто-нибудь сможет помочь? Спасибо.


                                  Если я правильно помню, то алг. Леммера выглядит так:

                                  R(n)=(R(n-1)*a)\%m;
                                  m - фактически период генератора, желательно - простое число.
                                  а - тоже чего-то значит, не помню точно что.

                                  Я пробовала, получается довольно красивое равномерное распрделение
                                    дорогой лучше КНУТа тебе никто не скажет :)
                                    Не помню в котором томе - но тебе нужно хорошенько покопаться.
                                       Кстати, для проверки - хорош или нет генератор случайных чисел, можно использовать
                                      визуальный графический метод. Вывод каждой пары значений RND на экран в цикле. Лучше всего в диапазоне 0...100( т.е. от RND берется два знака).
                                       прим.: лично опробовал многие RNDшки, но равномерного распределения точек практически нигде небыло... Тут большое поле для экспериментов...
                                      Сообщение отредактировано: kardinal -
                                        Цитата Ruben, 24.03.03, 00:24:52
                                        дорогой лучше КНУТа тебе никто не скажет :)
                                        Не помню в котором томе - но тебе нужно хорошенько покопаться.


                                        1) во втором томе

                                        никто не скажет?

                                        из этого ничего не следует надо не сказать хорошо а обЪяснить понятно
                                        две разные вещи

                                        самым удачным и в то же время не доказанным считается использование цифр трансцендентных чисел

                                        например цифры числа пи - хорошая бесконечная случ послндовательность

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

                                        с уважением
                                          Цитата esperanto, 25.03.03, 20:49:20


                                          в частности те распределения у которых нет мат.ожидания



                                          а что, УЖЕ И ТАКИЕ ПОЯВИЛИСЬ?????????????????????7
                                            All, кому надо - ловите исходник randoma

                                            переменная seed инициализируется до вызова функции. Таймером, к примеру.
                                            ExpandedWrap disabled
                                              <br>random proc<br> push bx<br> mov ax,seed<br> mov cx,8<br>newbit:<br> mov bx,ax<br> and bx,002Dh<br> xor bh,bl<br> clc<br> jpe shift<br> stc<br>shift:<br> rcr ax,1<br> loop newbit<br> mov seed,ax<br> xor ah,ah<br> pop bx<br> ret<br>seed dw ?<br>random endp<br>
                                              Цитата wormball, 28.03.03, 18:19:35


                                              а что, УЖЕ И ТАКИЕ ПОЯВИЛИСЬ?????????????????????7


                                              а  как же например распределение Коши
                                                Цитата esperanto, 29.03.03, 19:19:59


                                                а  как же например распределение Коши


                                                к твоему сведению, у него бесконечна дисперсия, а математическое ожидание у него 0.

                                                к тому же и его можно запросто сгенерировать, правда только в диапазоне extended (aka long double) ;D ;D ;D.
                                                  integral (x/(1+x^2),0,00)=integral(d(x^2+1)/(x^2+1),0,00)=ln(x^2+1),0,00)==00

                                                  tak 4to u4ite terber
                                                  i ne umni4ajte
                                                    я тут на досуге даже придумал, как из одного распределения получить другое. хотя никто вроде не высказывал желания его узнать, а я всё равно напишу.

                                                    пусть у нас есть случайная величина х, распределённая по закону g(x). надо найти такую функцию у=у(х), чтобы она была распределена по закону f(y). вероятность

                                                    dP = f(y)dy = g(x)dx

                                                    проинтегрируем

                                                    F(y)=G(x)+c

                                                    y=F^-1(G(x)+c), где с - произвольная постоянная.
                                                      я думаю проблема в нахождении обратных функций!??
                                                        Цитата esperanto, 01.04.03, 18:05:43
                                                        я думаю проблема в нахождении обратных функций!??


                                                        ну это смотря какова прямая функция. например нормальное распределение вообще нельзя проинтегрировать аналитически, а в случае с коши там будет нечто вроде тангенса.

                                                        с другой стороны как интегралы, так и обратные функции можно взять численно ;D

                                                        проблема в том, что там будут очень большие значения производных
                                                          Мне тут задали написать три разных генераторов случайных чисел. Не подскажете как? :wacko:
                                                            Народ...подскажите как всетки пользоваться этим генератором случайных чисел??
                                                            Позарез надо((((
                                                              http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c
                                                              Признанный во всём мире генератор с примером использования.
                                                                Цитата gena_dj @
                                                                http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c
                                                                Признанный во всём мире генератор с примером использования.

                                                                Во-всем мире он не признан.
                                                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                0 пользователей:


                                                                Рейтинг@Mail.ru
                                                                [ Script execution time: 0.1954 ]   [ 14 queries used ]   [ Generated: 24.10.26, 05:47 GMT ]