о случайности
Apr. 24th, 2014 01:36 pmВ блоге о теории сложности Билл Гасарк недавно рассказал забавную историю (англ.), которую я перескажу.
Меня эта история заставила задуматься вот над каким вопросом. Предположим, у вас нет генератора случайных чисел (т.е. монеты), но вы все равно хотите сгенерировать случайную последовательность нетривиальной длины - десятки бит, как минимум. Как это сделать? Например, вы сидите в кафе, перед вами чашка кофе, тетрадь и карандаш. Только что вы заплатили за кофе последней мелочью, что у вас была в кошельке. Телефон, планшет и ноутбук остались дома. Не вставая с места, вы хотите записать случайную (в идеале) последовательность нулей и единиц. Ваши действия?
Я придумал один способ, но у него есть немало недостатков. Может, вы придумаете лучше? Мой способ такой:
Мой способ предполагает, что в кафе много посетителей и часто кто-то новый входит. Я сижу за столиком и слежу за входом. Кладу руку на стол, и начинаю водить указательным пальцем по столу, вправо-влево, вправо-влево, ритмическое круговое движение вокруг вертикальной оси (т.е. вся рука лежит неподвижно, только палец движется). Это легко делать равномерно, с периодом примерно одна секунда. Каждый раз, когда кто-то входит в кафе, в момент пересечения им дверного проема, если мой палец находится левее вертикальной оси вращения, это 0, если правее, это 1. Если настолько близко к оси, что я не уверен, то жду следующего. Если кто-то заходит очень медленно или тормозит прямо в дверном проеме, жду следующего. Далее, каждый раз, когда я получаю 0 или 1, я записываю, и жду перерыва между входящими как минимум в 5 секунд (отсчитываю в уме). Пока не будет такого перерыва, я не начинаю опять вращать пальцем и учитывать входящих. Это должно устранить неслучайные эффекты от людей, входящих друг за другом.
Главный недостаток этого метода в том, что скорость получения случайных битов зависит от посетителей. Если их мало, это долго и утомительно. Кроме того, я не уверен, что 5 секунд ожидания между входящими достаточно для качественной рандомизации. Другой вариант "триггера" - шум начинающей работать эспрессо-машины, если только одна работает в кафе.
Лектор дал студентам домашнее задание: подбросить монету 600 раз и записать последовательность О и Р (орлов и решек). Он предупредил их также, что если они попробуют просто написать случайную последовательность сами из головы, не подбрасывая, он это обнаружит. И действительно, в тех заданиях, что он собрал у студентов, в двух из них не было ни разу подряд шесть орлов или шесть решек - надежный знак того, что последовательность не случайная. Лектор вызывает к себе этих двоих студентов. Первый признается, что он действительно просто записал О и Р, как ему казалось случайным. Зато второй утверждает, что он на самом деле подбрасывал монету 600 раз и записывал за ней, но когда он увидел шесть орлов подряд, то подправил результат, потому что подумал, что учитель увидит эти шесть орлов подряд и решит, что последовательность не случайна.
Меня эта история заставила задуматься вот над каким вопросом. Предположим, у вас нет генератора случайных чисел (т.е. монеты), но вы все равно хотите сгенерировать случайную последовательность нетривиальной длины - десятки бит, как минимум. Как это сделать? Например, вы сидите в кафе, перед вами чашка кофе, тетрадь и карандаш. Только что вы заплатили за кофе последней мелочью, что у вас была в кошельке. Телефон, планшет и ноутбук остались дома. Не вставая с места, вы хотите записать случайную (в идеале) последовательность нулей и единиц. Ваши действия?
Я придумал один способ, но у него есть немало недостатков. Может, вы придумаете лучше? Мой способ такой:
Мой способ предполагает, что в кафе много посетителей и часто кто-то новый входит. Я сижу за столиком и слежу за входом. Кладу руку на стол, и начинаю водить указательным пальцем по столу, вправо-влево, вправо-влево, ритмическое круговое движение вокруг вертикальной оси (т.е. вся рука лежит неподвижно, только палец движется). Это легко делать равномерно, с периодом примерно одна секунда. Каждый раз, когда кто-то входит в кафе, в момент пересечения им дверного проема, если мой палец находится левее вертикальной оси вращения, это 0, если правее, это 1. Если настолько близко к оси, что я не уверен, то жду следующего. Если кто-то заходит очень медленно или тормозит прямо в дверном проеме, жду следующего. Далее, каждый раз, когда я получаю 0 или 1, я записываю, и жду перерыва между входящими как минимум в 5 секунд (отсчитываю в уме). Пока не будет такого перерыва, я не начинаю опять вращать пальцем и учитывать входящих. Это должно устранить неслучайные эффекты от людей, входящих друг за другом.
Главный недостаток этого метода в том, что скорость получения случайных битов зависит от посетителей. Если их мало, это долго и утомительно. Кроме того, я не уверен, что 5 секунд ожидания между входящими достаточно для качественной рандомизации. Другой вариант "триггера" - шум начинающей работать эспрессо-машины, если только одна работает в кафе.
no subject
Date: 2014-04-24 10:40 am (UTC)no subject
Date: 2014-04-24 02:09 pm (UTC)no subject
Date: 2014-04-24 10:43 am (UTC)no subject
Date: 2014-04-24 10:43 am (UTC)no subject
Date: 2014-04-24 10:51 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2014-04-24 10:45 am (UTC)Недостаток, что число мужчин и женщин на улице может быть изначально не одинаково по какой-то социальной причине. Но проще, чем ваш способ.
no subject
Date: 2014-04-24 10:55 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2014-04-24 10:46 am (UTC)Четная цифра - ноль, нечетная - единица, ну или наоборот.
Неутомительно и довольно рандомально.
no subject
Date: 2014-04-24 10:53 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2014-04-24 10:56 am (UTC)филологический генератор
Date: 2014-04-25 01:34 pm (UTC)Ещё я с цифрами числа "пи" так же делаю: если надо сгенерировать небольшой "случайный" массив из нулей и единиц, причём так, что потом его легко будет воспроизвести заново.
no subject
Date: 2014-04-24 10:56 am (UTC)плюсы способа - достаточно случайно, легко реализуемо.
минусы - карандаш может сломаться, окружающие посмотрят как на идиота.
no subject
Date: 2014-04-24 11:19 am (UTC)no subject
Date: 2014-04-24 10:59 am (UTC)(Разлиновать клетку можно и самому. Точности не требуется.)
no subject
Date: 2014-04-24 10:59 am (UTC)Слишком банально ? )
no subject
Date: 2014-04-24 01:29 pm (UTC)(no subject)
From:no subject
Date: 2014-04-24 11:01 am (UTC)no subject
Date: 2014-04-24 11:05 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2014-04-24 11:01 am (UTC)no subject
Date: 2014-04-24 12:32 pm (UTC)(no subject)
From:no subject
Date: 2014-04-24 11:13 am (UTC)no subject
Date: 2014-04-24 11:14 am (UTC)(no subject)
From:no subject
Date: 2014-04-24 11:15 am (UTC)no subject
Date: 2014-04-24 12:50 pm (UTC)Правда, можно расчертить листок на узкие секторы и вращать карандаш на нём.
(no subject)
From:no subject
Date: 2014-04-24 11:17 am (UTC)no subject
Date: 2014-04-24 11:19 am (UTC)no subject
Date: 2014-04-24 01:13 pm (UTC)no subject
Date: 2014-04-24 11:21 am (UTC)no subject
Date: 2014-04-24 11:21 am (UTC)Этот способ (и многие другие предложенные в комментах) предполагает "у нас нет ГСЧ, так давайте сделаем ГСЧ из подручных средств". Мне вот первым в голову пришло разрисовать на бумажке "циферблат" на 16 или 32 делений, и раскручивать карандаш (как стрелку) - это даст по 4-5 бита за раз. Но это противоречит условию, в котором написано "предположим, у вас нет генератора случайных чисел"! Что нет именно монеты - это фигня, уж плоское и пригодное для подбрасывания сплошь и рядом, достаточно оглядеться - нет у нас генератора, вообще :-)
Поэтому я предлагаю "сделать более рандомным" то, что генерирует человек "из головы". Например, так: нагенерировать "из головы" нули и единицы (с неизбежными статистическими артефактами вроде отсутствия нескольких нулей/единиц подряд), "перемешать" - взять из исходной последовательности подпоследовательность с шагом 5 начиная с позиции 1, затем с шагом 5 начиная с 2, с 3 с 4 и с 5 (можно придумать и более сложное перемешивание), а затем ещё пройтись "бегущим xor" (new_X[i] = X[i] xor X[i-i]). Результат, конечно, по прежнему будет неслучаен, но по свойствам он будет значительно ближе к случайному, чем просто придуманный из головы. В конце концов, для практических применений истинность случайности неважна, важна непредсказуемость, ну и статистические характеристики.
Я бы, конечно, предложил нагенерировать из головы сразу числа, и побольше, а потом вычислить от них какую-нибудь хорошую хэш-функцию (раза в 2-3 более короткую, чем входные данные - в этом случае результат будет настолько близок к настоящим случайным числам, насколько это вообще возможно для неслучайных), но без "компьютера" (планшета) это слишком сложно. Хотя, теоретически, и возможно :-)
no subject
Date: 2014-04-24 11:55 am (UTC)no subject
Date: 2014-04-24 11:22 am (UTC)Самое надежное - вычислять какое-то иррациональное число. Вроде бы со стороны это неотличимо от случайной последовательности.
Интересно, что когда последовательность формируется не случайно (как знаки числа пи, например) со стороны она будет казаться случайной (если интересуемся четностью знаков), мы можем это гарантировать.
А вот если мы берем настоящий генератор случайных чисел - то может случайно и закономерность обнаружиться. Более того, откуда мы можем знать, что это - "настоящий генератор"?
no subject
Date: 2014-04-24 11:25 am (UTC)no subject
Date: 2014-04-24 11:40 am (UTC)no subject
Date: 2014-04-24 12:26 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2014-04-24 12:00 pm (UTC)Нарвать из тетради бумажек, написать на них нули и единицы, положить в чашку, взболтать, доставать по одной не глядя.
no subject
Date: 2014-04-24 12:06 pm (UTC)no subject
Date: 2014-04-24 12:22 pm (UTC)no subject
Date: 2014-04-24 12:07 pm (UTC)no subject
Date: 2014-04-24 12:22 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2014-04-24 12:07 pm (UTC)no subject
Date: 2014-04-24 12:12 pm (UTC)вполне возможна систематическая ошибка
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2014-04-24 12:21 pm (UTC)Кстати, когда работал в социологии, всегда очень легко определял мухлюющих интервьюеров просто по массиву данных. Блок "нарисованных" анкет светился там, будто маяк в степи даже когда придумана была не вся анкета, а только несколько вопросов, не заданных по лени.
no subject
Date: 2014-04-24 12:25 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: