«И плохой генератор ПСЧ на что-нибудь годится»
Полумесяц с ретортой
![Полумесяц с ретортой](https://habrastorage.org/getpro/habr/post_images/f04/177/066/f04177066a31233f8b9436969eaf795e.jpg)
В процессе работы над одной задачей возник неожиданный побочный эффект. Визуализация хорошего генератора псевдослучайных чисел представляет собой шум и\или путаницу. Заведомо плохой никто не хочет применять даже для тестов. Мне было все равно, примененный очень простой генератор меня вполне удовлетворял и при аккуратном обращении с ним выдавал приемлемый результат. И вдруг будто-то кто-то уверенным росчерком стал выдавать изящные абстрактные рисунки.
Всего 22 точки соединены кривыми Безье и такой забавный результат. Загогулины можно бесконечно генерировать и за ними, как за облаками, не надоедает наблюдать. Можно придумать интересную игру — разгадать, что же выдала на сей раз нам случайность, какая в ней есть закономерность и придумать ей название.
Но у этих кривых есть и более практическое значение. Генератор представляет собой произведение младшей и старшей части счетчика тиков процессора, от которого взят беззнаковый остаток. Если генерировать числа достаточно редко, случайность получается терпимой. Здесь числа генерируются часто, случайность плохая, что и видно по формам загогулин. Несмотря на потенциальное количество 200 в 22 степени разных загогулин, чаще всего повторяются определенные элементы.
Предположительно, степень «лохматости» фигуры, зависит от нагрузки на систему в те микросекунды, когда генерировались числа. Диагональная линия, ака «путешественник» говорит о почти линейной зависимости случайных числе от времени и малой нагрузке на систему. «Скалярия» — о большей случайности, а значит достаточно высокой нагрузке…
Для тех, кто захочет развлечься лиловыми загогулинами, ниже приведен код и несколько ярких представителей.
Немного кода
Этот код, запущенный в консоли SPF, создаст исполняемый файл warpy.exe, который уже можно запускать сам по себе. Двойной клик (левой кнопкой) по картинке меняет ее. Кнопочка в правом нижнем углу сохраняет набор координат X, Y в файл warps.txt
~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
Еще картинки
Парапарабола
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/8f3/75f/5c1/8f375f5c11082ccd1b9d0393caf24c30.jpg)
Воробей
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/a58/d9b/f12/a58d9bf1265e988dd3b92294f466b1ca.jpg)
Скалярия
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/79d/85f/624/79d85f624097e833c8f61f1ac53a1d26.jpg)
Плекторы
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/45c/376/751/45c37675178a65067a76d785122aa6f1.jpg)
Цветок, вид сверху
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/b39/5fc/336/b395fc3362875af544cfbe0d06eb25b7.jpg)
Тюльпан
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/ae6/e4c/0ee/ae6e4c0ee9b71312bb91331246748362.jpg)
Путешественник
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/43a/103/54c/43a10354ceda68ccc2ba57790e02a8a6.jpg)
Декантер с двумя бутылками
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/2e0/45b/837/2e045b837e2fa78429ce7e852141f9a6.jpg)
Лассо
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/ded/56e/69a/ded56e69a9f1dca6d45f7a3c9909f0fd.jpg)
Кандинский
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/722/bb1/d52/722bb1d523b227d7a24d1d9a5de66ff7.jpg)
![](https://habrastorage.org/getpro/habr/post_images/8f3/75f/5c1/8f375f5c11082ccd1b9d0393caf24c30.jpg)
Воробей
![](https://habrastorage.org/getpro/habr/post_images/a58/d9b/f12/a58d9bf1265e988dd3b92294f466b1ca.jpg)
Скалярия
![](https://habrastorage.org/getpro/habr/post_images/79d/85f/624/79d85f624097e833c8f61f1ac53a1d26.jpg)
Плекторы
![](https://habrastorage.org/getpro/habr/post_images/45c/376/751/45c37675178a65067a76d785122aa6f1.jpg)
Цветок, вид сверху
![](https://habrastorage.org/getpro/habr/post_images/b39/5fc/336/b395fc3362875af544cfbe0d06eb25b7.jpg)
Тюльпан
![](https://habrastorage.org/getpro/habr/post_images/ae6/e4c/0ee/ae6e4c0ee9b71312bb91331246748362.jpg)
Путешественник
![](https://habrastorage.org/getpro/habr/post_images/43a/103/54c/43a10354ceda68ccc2ba57790e02a8a6.jpg)
Декантер с двумя бутылками
![](https://habrastorage.org/getpro/habr/post_images/2e0/45b/837/2e045b837e2fa78429ce7e852141f9a6.jpg)
Лассо
![](https://habrastorage.org/getpro/habr/post_images/ded/56e/69a/ded56e69a9f1dca6d45f7a3c9909f0fd.jpg)
Кандинский
![](https://habrastorage.org/getpro/habr/post_images/722/bb1/d52/722bb1d523b227d7a24d1d9a5de66ff7.jpg)