Лиловые закорючки

    «И плохой генератор ПСЧ на что-нибудь годится»



    Полумесяц с ретортой
    Полумесяц с ретортой
    В процессе работы над одной задачей возник неожиданный побочный эффект. Визуализация хорошего генератора псевдослучайных чисел представляет собой шум и\или путаницу. Заведомо плохой никто не хочет применять даже для тестов. Мне было все равно, примененный очень простой генератор меня вполне удовлетворял и при аккуратном обращении с ним выдавал приемлемый результат. И вдруг будто-то кто-то уверенным росчерком стал выдавать изящные абстрактные рисунки.
    Всего 22 точки соединены кривыми Безье и такой забавный результат. Загогулины можно бесконечно генерировать и за ними, как за облаками, не надоедает наблюдать. Можно придумать интересную игру — разгадать, что же выдала на сей раз нам случайность, какая в ней есть закономерность и придумать ей название.
    Но у этих кривых есть и более практическое значение. Генератор представляет собой произведение младшей и старшей части счетчика тиков процессора, от которого взят беззнаковый остаток. Если генерировать числа достаточно редко, случайность получается терпимой. Здесь числа генерируются часто, случайность плохая, что и видно по формам загогулин. Несмотря на потенциальное количество 200 в 22 степени разных загогулин, чаще всего повторяются определенные элементы.
    Предположительно, степень «лохматости» фигуры, зависит от нагрузки на систему в те микросекунды, когда генерировались числа. Диагональная линия, ака «путешественник» говорит о почти линейной зависимости случайных числе от времени и малой нагрузке на систему. «Скалярия» — о большей случайности, а значит достаточно высокой нагрузке…
    Для тех, кто захочет развлечься лиловыми загогулинами, ниже приведен код и несколько ярких представителей.




    Немного кода
    ~yz/lib/winctl.f
    REQUIRE WINDOWS... ~yz/lib/winlib.f
    
    0 VALUE win
    0 VALUE times
    0 VALUE hdc
    0 VALUE myrect
    0 VALUE mypen2
    22 VALUE dots
    0 VALUE fid
    CREATE 0d0a  0xD C, 0xA C, 
    
    CREATE *dots dots CELLS 3 * ALLOT
    
    : rnd TIMER@ * 200 UMOD ;
    
    : rndxy   dots 2* 0 DO rnd 2 * 25 +  I CELL * *dots + !   rnd 3 * 25 + I CELL * *dots + CELL+ ! LOOP  ;
    
    : tre rndxy 
    S" X: "  fid WRITE-FILE THROW 
    dots 2* 0 DO  I CELL * *dots + @ S>D (D.) fid WRITE-FILE THROW  S"  " fid WRITE-FILE THROW  LOOP
    0d0a 2 fid WRITE-FILE THROW
    
    S" Y: "  fid WRITE-FILE THROW
    dots 2* 0 DO  I CELL * *dots + CELL+ @ S>D (D.) fid WRITE-FILE THROW S"  " fid WRITE-FILE THROW LOOP
    0d0a 2 fid WRITE-FILE THROW
    0d0a 2 fid WRITE-FILE THROW
    
     ;
     
     rndxy
     
    WINAPI: CreatePen GDI32.dll
    WINAPI: PolyBezier GDI32.dll
    
    
    PROC: paint
      mypen2 windc SelectObject DROP
      dots *dots windc PolyBezier DROP
      rndxy
    PROC;
    
    MESSAGES: my
    
    M: wm_lbuttondblclk
        rndxy 
        win winhide
        win winshow 
      TRUE
    M;
    MESSAGES;
    
    : run 
      WINDOWS...
    S" warps.txt" R/W CREATE-FILE THROW TO fid
    
    0x00F00599 2 0 CreatePen TO mypen2
    
    0 create-window TO win
     win TO winmain
     " Безьешки" win -text!
    420 430 0 button  place 
    this TO myrect
    10 10 myrect ctlresize
      ['] tre myrect -command!
    
    120 130 win winmove
    500 500 win winresize
       paint win -painter!
      my win -wndproc!
    win winshow
    
    ...WINDOWS
    fid CLOSE-FILE THROW
    BYE
    ;
    
    TRUE TO ?GUI
    ' run MAINX !
    S" warpy.exe" SAVE
    run
    
    


    Этот код, запущенный в консоли SPF, создаст исполняемый файл warpy.exe, который уже можно запускать сам по себе. Двойной клик (левой кнопкой) по картинке меняет ее. Кнопочка в правом нижнем углу сохраняет набор координат X, Y в файл warps.txt


    Еще картинки
    Парапарабола

    Воробей

    Скалярия

    Плекторы

    Цветок, вид сверху

    Тюльпан

    Путешественник

    Декантер с двумя бутылками

    Лассо

    Кандинский
    Метки:
    Поделиться публикацией
    Комментарии 22
    • +30
      добавьте тег «упоротое программирование»
      • +4
        Превосходное сочетание юзернейма и комментария!
      • +8
        Узнал несколько новых слов.
        • 0
          Интересно, какие?
          • +1
            tre и ALLOT.
            • +3
              Пара-пара-парадуемсябола...!!1
              • 0
                tre — просто лень придумывать название. ALLOT пришлось использовать из-за некоторых нюансов с целевой компиляцией.
          • +4
            Точно пятница. А вообще — прелесть.
            • 0
              Кстати, не подскажите пост про графическое выявление псевдослучайности чисел. Там были такие же монохромные картинки как здесь, но их было значительно больше. Никак не находится.
              • +2
                Психологам эти картинки очень пригодятся для тестов.
                • +5
                  Генератор красивых автографов.
                  • +1
                    Сделайте в тридцать строк на JavaScript возможность генерить подобные штуки в браузере с выбором параметров — будет шикарно!
                    • +11
                      humor>Да это же генератор подписей на документы!</humor
                    • +2
                      Справа внизу кнопочка не нажимается!
                      • 0
                        На этих картинках и не должна.
                      • 0
                        <зануда> Парабола все-таки скорее гипербола, судя по двум ветвям. </зануда>
                        • +1
                          Воробей скорее пчёлка. Забавненько.
                          • –3
                            Один я, на кнопочку, в правом нижнем углу КДПВ нажимал?
                            • +1
                              Можно нагенерить карточки для игры Dixit. Или просто предлагать игрокам дать свое определение (письменно), банк забирают те, чьи определения совпадают.
                              • 0
                                Эх, стековый язык тяжело воспринимается. Будет ли версия на более привычном языке, и желательно на гитхабе?
                                • 0
                                  А тут совсем нечего программировать. Это WINAPIшный PolyBezier на массиве из 22 точек. ГСЧ, с помощью которого заполняется массив, можно попробовать любой.

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.