(no subject)
Mar. 2nd, 2009 11:13 pmПоследними дискуссиями у Витуса навеяло.
Я очень хорошо помню этот момент. Год был 1992-й, я только поступил в институт. Мы с Лешей Студеновым собирались писать на Pascal-е (C я тогда не знал) некую экономическую игру. Договорились вечером, разошлись по домам, и я задумался.
Игра начиналась с раздачи карт. Карты естественным образом ложились в двумерный массив, а раздавать надо было датчиком случайных чисел. И тут я задумался - а что, если одна и та же карта выпадет в раздаче дважды? Немного подумав, я понял, что просто повторять раздачу этой карты бесполезно - то же число может выпасть и третий раз. Мне стало очень грустно. И тут меня осенило - есть же цикл while! Он решит все проблемы!
Второго такого озарения с тех пор в моем програмистском опыте не было. Но ощущения я запомнил навсегда.
Я очень хорошо помню этот момент. Год был 1992-й, я только поступил в институт. Мы с Лешей Студеновым собирались писать на Pascal-е (C я тогда не знал) некую экономическую игру. Договорились вечером, разошлись по домам, и я задумался.
Игра начиналась с раздачи карт. Карты естественным образом ложились в двумерный массив, а раздавать надо было датчиком случайных чисел. И тут я задумался - а что, если одна и та же карта выпадет в раздаче дважды? Немного подумав, я понял, что просто повторять раздачу этой карты бесполезно - то же число может выпасть и третий раз. Мне стало очень грустно. И тут меня осенило - есть же цикл while! Он решит все проблемы!
Второго такого озарения с тех пор в моем програмистском опыте не было. Но ощущения я запомнил навсегда.
no subject
Date: 2009-03-02 08:21 pm (UTC)no subject
Date: 2009-03-02 09:02 pm (UTC)Вообще мое любимое занятие как программиста (после пристройки плюс-минус нового куска, если это не требует нудного кодирования базового фреймворка) - выжимать максимум из имеющейся архитектуры. Расшивая узкие места по необходимости, но все равно расширяя имеющееся.
no subject
Date: 2009-03-02 08:38 pm (UTC)no subject
Date: 2009-03-02 08:44 pm (UTC)P.S. Причём автоопределяет cp1251 и utf-8. Сейчас с интересом читаю мой любимый текст "весь юникод по алфавиту", смотрю, какие буквы в нём есть. Уже нашлись: латиница разная, греческий, кириллица, иврит, арабский, тайский и деванагари. Дальше крутить лень.
P.P.S. Но вот нормальной навигации по большому тексту встроенной всё-таки, похоже, нет.
... В Греции всё есть, даже проблемы с кодировками ...
no subject
Date: 2009-03-02 08:48 pm (UTC)Правда, тогда цикл понадобится для того чтобы найти карту номер N, не считая уже выданых. Но зато время завершения детерминировано.
Этот способ более точно имитирует раздачу карт из колоды. Хотя еще более точной имитацией было бы сгенерировать случайную перестановку массива, а потом просто отсчитать N первых.
no subject
Date: 2009-03-02 09:01 pm (UTC)Узнаешь много нового и интересного (например, она пользуется двумя разными алгоритмами в зависимости от соотношения размеров колоды и выборки).
... За каникулами, книгами и кеннингами канувших князей ...
no subject
Date: 2009-03-02 09:03 pm (UTC)no subject
Date: 2009-03-03 09:04 am (UTC)Вообще-то можно просто закодить формулу, который по заданному [псевд]случайному семечку возвращает псевдослучайную последовательность заведомо неповторяющихся чисел, причем в нужном диапазоне. У Кнута, скажем, спереть - у него целый том этому посвящен, помнится.
Кинуть кубик еще раз, кстати, плохой метод, порождает уязвимости.
no subject
Date: 2009-03-03 09:14 am (UTC)Фамилию Кнута я тогда не слышал еще.
no subject
Date: 2009-03-03 09:08 am (UTC)Вопрос: хочу получить последовательность чисел от 0 до N-1, в случайном порядке, причём они не должны повторяться.
Ответ:
x(n+1) = (a * x(n) + c) % N, x(0) = rand(),
где a взаимно просто с N;
a - 1 кратно p для всех простых p — делителей m;
a - 1 кратно 4, если m кратно 4.
Выдаёт числа от 0 до N-1 в псевдослучайном порядке.
Это называется линейным конгруэнтным генератором (linear congruential generator, LCG). Существует множество других генераторов. Подробности во втором томе Кнута.
no subject
Date: 2009-03-03 09:12 am (UTC)no subject
Date: 2009-03-03 09:15 am (UTC)no subject
Date: 2009-03-03 01:29 pm (UTC)no subject
Date: 2009-03-03 01:43 pm (UTC)no subject
Date: 2009-11-22 08:49 pm (UTC)no subject
Date: 2009-03-02 08:51 pm (UTC)... Ледяные ласки огненных лисиц ...
no subject
Date: 2009-03-02 09:05 pm (UTC)Кто-то тут недавно рассказывал про GPF, вызванный ошибкой в самописном рандоме - возвращал число не от 0 до n-1, а до n - а результат использовался как индекс в массиве.
no subject
Date: 2009-03-02 09:14 pm (UTC)ПыСы: генератор совершенно не обязан быть самописным. Просто сишники с молоком матери впитали, что верхняя граница диапазона всегда исключительная (i=0;i<n;i++), а rand определена в stdlib как возвращающая величины от 0 до RAND_MAX включительно. Плакать после слова "грабли".
... Зачем ты выключил свопинг? ...
no subject
Date: 2009-03-02 09:30 pm (UTC)no subject
Date: 2009-03-02 09:37 pm (UTC)... Вы сбиваете с толку весь Париж! ...
no subject
Date: 2009-03-03 05:12 am (UTC)Кстати, полагаю, что либо это в стандарте не особо оговорено, либо каждый производитель компилятора трактует по-всякому.
Из ISO 9899:1999 (E)
Date: 2009-03-03 07:43 am (UTC)То есть да, формулировка недостаточно точная, но пример всё проясняет.
no subject
Date: 2009-11-22 08:52 pm (UTC)