(no subject)
Mar. 2nd, 2009 11:13 pmПоследними дискуссиями у Витуса навеяло.
Я очень хорошо помню этот момент. Год был 1992-й, я только поступил в институт. Мы с Лешей Студеновым собирались писать на Pascal-е (C я тогда не знал) некую экономическую игру. Договорились вечером, разошлись по домам, и я задумался.
Игра начиналась с раздачи карт. Карты естественным образом ложились в двумерный массив, а раздавать надо было датчиком случайных чисел. И тут я задумался - а что, если одна и та же карта выпадет в раздаче дважды? Немного подумав, я понял, что просто повторять раздачу этой карты бесполезно - то же число может выпасть и третий раз. Мне стало очень грустно. И тут меня осенило - есть же цикл while! Он решит все проблемы!
Второго такого озарения с тех пор в моем програмистском опыте не было. Но ощущения я запомнил навсегда.
Я очень хорошо помню этот момент. Год был 1992-й, я только поступил в институт. Мы с Лешей Студеновым собирались писать на Pascal-е (C я тогда не знал) некую экономическую игру. Договорились вечером, разошлись по домам, и я задумался.
Игра начиналась с раздачи карт. Карты естественным образом ложились в двумерный массив, а раздавать надо было датчиком случайных чисел. И тут я задумался - а что, если одна и та же карта выпадет в раздаче дважды? Немного подумав, я понял, что просто повторять раздачу этой карты бесполезно - то же число может выпасть и третий раз. Мне стало очень грустно. И тут меня осенило - есть же цикл while! Он решит все проблемы!
Второго такого озарения с тех пор в моем програмистском опыте не было. Но ощущения я запомнил навсегда.
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)