Придумал способ получать действительно случайные числа
От: sikorsky Украина  
Дата: 24.10.07 12:30
Оценка: 1 (1) -1 :))) :))) :)))
Здравствуйте!

Возможно, способ предложенный мной уже кому-то знаком. Однако, он пришел мне в голову буквально минут 30 назад (не украл ). Такого поиском вроде не нашел. Я его реализовал и проверил. Действительно, этот код дает возможность получения непредсказуемых (невоспроизводимых?) последовательностей! Для простоты сдел максимально просто. Класс позволяет получить случайный бит. 1 или 0.

Код:

Использование:


using System;

namespace Random
{
    class Program
    {
        static void Main(string[] args)
        {
            RealRnd rnd = new RealRnd();

            rnd.Compute();
            Console.WriteLine(rnd.RandomizedBit);
        }
    }
}


Сам класс:


using System;
using System.Text;
using System.Threading;

namespace Random
{
    public class RealRnd
    {
        private bool _cumputed;
        private StringBuilder _rnd;
        private readonly int _factor;

        public string RandomizedString
        {
            get
            {
                if (this._cumputed == false)
                    return string.Empty;

                lock (this._rnd)
                {
                    return this._rnd.ToString();
                }
            }
        }

        public int RandomizedBit
        {
            get
            {
                if (this._cumputed == false)
                    return -1;

                int b01 = 0;
                int b10 = 0;
                string s = this.RandomizedString;

                for (int i = 0; i != s.Length - 1; i++)
                {
                    if (s[i] == '0' && s[i + 1] == '1') b01++;
                    else if (s[i] == '1' && s[i + 1] == '0') b10++;
                }

                return b01 > b10 ? 0 : 1;
            }
        }

        public RealRnd()
        {
            this._rnd = new StringBuilder();
            this._factor = 10000;
        }

        public RealRnd(int factor)
            : this()
        {
            this._factor = factor;
        }

        public void Compute()
        {
            Thread t = new Thread(this._Compute);

            t.Start();

            for (int i = 0; i != this._factor; i++)
                lock (this._rnd) { this._rnd.Append('0'); }

            this._cumputed = true;
        }

        private void _Compute()
        {
            for (int i = 0; i != this._factor; i++)
                lock (this._rnd) { this._rnd.Append('1'); }
        }
    }
}


Метод RandomizedBit сейчас работает глупо. Распределение результатов в среднем не 50 на 50. Но это ОЧЕНЬ легко исправить. Достаточно получить хэш от результирующей строки и уже с этим хэшем производить вычисления. (при изменении строки хотя бы на один символ хэш будет абсолютно другим).

Ну что же, хотелось бы узнать мнения.

24.10.07 16:53: Перенесено модератором из '.NET' — Хитрик Денис
Re: Придумал способ получать действительно случайные числа
От: e-garin Россия  
Дата: 24.10.07 13:16
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>Здравствуйте!


S>Возможно, способ предложенный мной уже кому-то знаком. Однако, он пришел мне в голову буквально минут 30 назад (не украл ). Такого поиском вроде не нашел. Я его реализовал и проверил. Действительно, этот код дает возможность получения непредсказуемых (невоспроизводимых?) последовательностей! Для простоты сдел максимально просто. Класс позволяет получить случайный бит. 1 или 0.


<поскипан код>

S>Метод RandomizedBit сейчас работает глупо. Распределение результатов в среднем не 50 на 50. Но это ОЧЕНЬ легко исправить. Достаточно получить хэш от результирующей строки и уже с этим хэшем производить вычисления. (при изменении строки хотя бы на один символ хэш будет абсолютно другим).


S>Ну что же, хотелось бы узнать мнения.


Таки объясните, где же у Вас тот самый источник "действительной случайности", который не позволит "предсказать" и "воспроизвести" последовательность человеку, знающему приведенный Вами код? (ведь случайность не может опираться на незнание алгоритма генерации (псевдо)случайного числа или его запутанность — должна быть какая-то "тайна", а здесь её что-то не видно )
А мне нравится жить :).
Re: Придумал способ получать действительно случайные числа
От: Константин Россия  
Дата: 24.10.07 13:23
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

S>Здравствуйте!


S>Возможно, способ предложенный мной уже кому-то знаком. Однако, он пришел мне в голову буквально минут 30 назад (не украл ). Такого поиском вроде не нашел. Я его реализовал и проверил. Действительно, этот код дает возможность получения непредсказуемых (невоспроизводимых?) последовательностей! Для простоты сдел максимально просто. Класс позволяет получить случайный бит. 1 или 0.



Какое распределение?
Какие тесты случайности проходят?

Если на эти вопросы ответа нет, то в библиотеку и читать Кнута (или что-то подобное, по-вкусу)
Re[2]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 24.10.07 13:36
Оценка: 1 (1)
Здравствуйте, e-garin, Вы писали:

EG>Таки объясните, где же у Вас тот самый источник "действительной случайности", который не позволит "предсказать" и "воспроизвести" последовательность человеку, знающему приведенный Вами код? (ведь случайность не может опираться на незнание алгоритма генерации (псевдо)случайного числа или его запутанность — должна быть какая-то "тайна", а здесь её что-то не видно )

Как я понимаю "фичей" тут должно служить то, что два потока пишут в строку одновременно (через критическую секцию): один пишет "0" другой "1". Затем в полученной строке подсчитывается кол-во комбинаций "01" и "10". В зависимости от того, каких из них больше на выход подается либо "0" либо "1".

Автор явно надеется что переключение потоков и будет той самой "действительной случайностью".
ДеЦкий сад — штаны на лямках.

Аффтару срочно в библиотеку читать классиков.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 13:45
Оценка:
Здравствуйте, e-garin, Вы писали:

EG>Таки объясните, где же у Вас тот самый источник "действительной случайности", который не позволит "предсказать" и "воспроизвести" последовательность человеку, знающему приведенный Вами код? (ведь случайность не может опираться на незнание алгоритма генерации (псевдо)случайного числа или его запутанность — должна быть какая-то "тайна", а здесь её что-то не видно )


Знание алгоритма тут значения не имеет. Дело в том, что если два потока одновременно что-то делают, то нет возможности предсказать когда конкретный поток получит свой квант процессорног времени. Да и окружение в котором работает программа вряд ли можно воспроизвести. Потому результат работы каждый раз будет меняться. Я же написал, что сам выбор бита производится по ерундовому алгоритму. А вот строка, генерируемая потоками, действительно случайна. ИМХО. Ругайте
Re[3]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 13:48
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, e-garin, Вы писали:


CC>Автор явно надеется что переключение потоков и будет той самой "действительной случайностью".

CC>ДеЦкий сад — штаны на лямках.

CC>Аффтару срочно в библиотеку читать классиков.


Ну во-первых, "аффтар" не математик и этот код не результат многолетних исследований...

Я ответил на предыдущий вопрос вот что:

Дело в том, что если два потока одновременно что-то делают, то нет возможности предсказать когда конкретный поток получит свой квант процессорног времени. Да и окружение в котором работает программа вряд ли можно воспроизвести. Потому результат работы каждый раз будет меняться.

Так вот, я считаю, что получить случайное число так гораздо более случайно, чем используя Систем.РАндом.

Расскажите, какие вам извесны способы получения информации о том, какой из конкурирующих потоков получит больше квантов ЦПУ?
Re[2]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 13:51
Оценка:
Здравствуйте, Константин, Вы писали:

К>Здравствуйте, sikorsky, Вы писали:


S>>Здравствуйте!


S>>Возможно, способ предложенный мной уже кому-то знаком. Однако, он пришел мне в голову буквально минут 30 назад (не украл ). Такого поиском вроде не нашел. Я его реализовал и проверил. Действительно, этот код дает возможность получения непредсказуемых (невоспроизводимых?) последовательностей! Для простоты сдел максимально просто. Класс позволяет получить случайный бит. 1 или 0.



К>Какое распределение?

К>Какие тесты случайности проходят?

К>Если на эти вопросы ответа нет, то в библиотеку и читать Кнута (или что-то подобное, по-вкусу)


Распределение количества 0 и 1 в результирующей строке каждый раз будет разным, потому как если два потока одновременно что-то делают, то нет возможности предсказать когда конкретный поток получит свой квант процессорног времени. Да и окружение в котором работает программа вряд ли можно воспроизвести.

А вот уже алгоритмик выбора 0 или 1 — ерунда. Он для примера. Чтобы не выводить строку.
Re[3]: Придумал способ получать действительно случайные числ
От: deniok Россия  
Дата: 24.10.07 14:05
Оценка: 1 (1) +2
Здравствуйте, sikorsky, Вы писали:


S>Распределение количества 0 и 1 в результирующей строке каждый раз будет разным, потому как если два потока одновременно что-то делают, то нет возможности предсказать когда конкретный поток получит свой квант процессорног времени. Да и окружение в котором работает программа вряд ли можно воспроизвести.


Шедулер OS (тот, кто в действительности переключает потоки, причём исходя из вполне детерминированного алгоритма) — весьма убог как рандомизатор. В вашей выходной строке наверняка будет куча корреляций.
Re[3]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 24.10.07 14:09
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>Дело в том, что если два потока одновременно что-то делают, то нет возможности предсказать когда конкретный поток получит свой квант процессорног времени.

Можно при некоторых условиях.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:13
Оценка:
Здравствуйте, deniok, Вы писали:

D>Шедулер OS (тот, кто в действительности переключает потоки, причём исходя из вполне детерминированного алгоритма) — весьма убог как рандомизатор. В вашей выходной строке наверняка будет куча корреляций.


Я думаю, что на то, сколько кусков времени получит каждый поток, будет влиять количество процессов в системе, их приоритеты, потребность в ресурсах и т.д. Т.е. характеристики, которые меняются каждый момент времени. Корреляций? В выходной строке будет равное количество 0 и 1. Однако, они будут перемешаны случайно. Если строка отличается хоть на один символ, легко получить по ней хэш. Чтобы разница стала более заметной. Да, это псевдослучайность, т.к. она зависит от состояния системы на момент генерации, однако именно это состояние не известно и, возможно, невоспроизводимо... Для Систем.Рандом можно перебрать все возможные входные условия, а вот для такого генератора, как мне кажется, нельзя.
Re[4]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 24.10.07 14:14
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>Так вот, я считаю, что получить случайное число так гораздо более случайно, чем используя Систем.РАндом.

CryptoAPI

S>Расскажите, какие вам извесны способы получения информации о том, какой из конкурирующих потоков получит больше квантов ЦПУ?

Примитивный вариант: 2 ядра. Каждый поток на своем ядре. первый лочит критсекцию, второй на ней ждет. Первый отпустил критсекцию, второй ее захватил, первый ждет....
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:15
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, sikorsky, Вы писали:


S>>Дело в том, что если два потока одновременно что-то делают, то нет возможности предсказать когда конкретный поток получит свой квант процессорног времени.

CC>Можно при некоторых условиях.

При "некоторых условиях" можно запросто жить на луне. Достаточно добавить атмосферу и т. д.

Можно ли более подробно. У вас есть число, полученное этим генератором. Пусть даже есть система, на которой оно получено. Каким образом вы сможете его воссоздать?
Re[5]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:20
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Примитивный вариант: 2 ядра. Каждый поток на своем ядре. первый лочит критсекцию, второй на ней ждет. Первый отпустил критсекцию, второй ее захватил, первый ждет....


НА моей машине Кор 2 Дуо. Сколько ядер?

И все работает.
Re[5]: Придумал способ получать действительно случайные числ
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 24.10.07 14:21
Оценка:
Здравствуйте, sikorsky, Вы писали:

[]

S>Для Систем.Рандом можно перебрать все возможные входные условия, а вот для такого генератора, как мне кажется, нельзя.


Важное выделено жирным Вам только кажется. Проведите два теста: один для System.Random, другой для вашего класса. Итераций этак на 100 000. Для вашего теста просто выводите куда-нибудь в файл хэш получившейся строки, для встроенного — случайное число. И посмотрите, чего получится. Я почти уверен, что примерно на 2-3 тысячной итерации ваш тест выдаст повторяющийся хэш
<< Не присоединяйся к нашему миру наркоманов: нас много, а наркоты мало. >>
Re[6]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:22
Оценка:
S>Здравствуйте, CreatorCray, Вы писали:

CC>>Примитивный вариант: 2 ядра. Каждый поток на своем ядре. первый лочит критсекцию, второй на ней ждет. Первый отпустил критсекцию, второй ее захватил, первый ждет....


Такой вариант был бы возможен если бы вычисление одного символа строки не влазило по времени в квант. А так как их влазит много (разное количество) то не прокатит. Потому и работает.
Re[6]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:27
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Здравствуйте, sikorsky, Вы писали:


F>[]


S>>Для Систем.Рандом можно перебрать все возможные входные условия, а вот для такого генератора, как мне кажется, нельзя.


F>Важное выделено жирным Вам только кажется. Проведите два теста: один для System.Random, другой для вашего класса. Итераций этак на 100 000. Для вашего теста просто выводите куда-нибудь в файл хэш получившейся строки, для встроенного — случайное число. И посмотрите, чего получится. Я почти уверен, что примерно на 2-3 тысячной итерации ваш тест выдаст повторяющийся хэш


Не факт, что повторяющийся хэш (мд5, например) возможен при всех возможных входных усовиях, которые могут быть выданы методом. А если входные данных одинаковы, то хэш тут не при делах... И сколько комбинаций дает нам 10 000 + 10 000 нулей и единиц? Наверное, больше, чем 100 000 итераций... Так что далеко не факт. Надо тестировать... Если нечего делать будет, может и потестирую. Повторюсь, этот класс не смысл жизни для меня
Re[7]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:30
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>Здравствуйте, Flamer, Вы писали:


F>>Важное выделено жирным Вам только кажется. Проведите два теста: один для System.Random, другой для вашего класса. Итераций этак на 100 000. Для вашего теста просто выводите куда-нибудь в файл хэш получившейся строки, для встроенного — случайное число. И посмотрите, чего получится. Я почти уверен, что примерно на 2-3 тысячной итерации ваш тест выдаст повторяющийся хэш



Пришло в голову... А если Систем.Рандом выдаст два одинаковых числа?

Я к тому, что это не страшно, если монетка, например, дважды упадет решкой. Или трижды.
Re[8]: Придумал способ получать действительно случайные числ
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 24.10.07 14:34
Оценка:
Здравствуйте, sikorsky, Вы писали:

[]

S>Пришло в голову... А если Систем.Рандом выдаст два одинаковых числа?

S>Я к тому, что это не страшно, если монетка, например, дважды упадет решкой. Или трижды.

А вы посмотрите название вашего топика: "Придумал способ получать действительно случайные числа" Мой пойнт в том, что вы заблуждаетесь в этом посыле и это не так. Всего лишь.
<< Лень — мать всех пороков, а родителей нужно уважать. >>
Re[9]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:38
Оценка:
Здравствуйте, Flamer, Вы писали:


F>А вы посмотрите название вашего топика: "Придумал способ получать действительно случайные числа" Мой пойнт в том, что вы заблуждаетесь в этом посыле и это не так. Всего лишь.


Стоп. Если алгоритм случайных чисел выдаст вдруг подряд 10 одинаковых чисел, он плох? В реальной жизни так бывает.

+ тогда можно говорить о причино-следственной связи и тогда не нет в мире ничего случайного вообще. Я не шучу щас. И даже хардверные генераторы не случайны
Re: Придумал способ получать действительно случайные числа
От: Cyberax Марс  
Дата: 24.10.07 14:42
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

S>Возможно, способ предложенный мной уже кому-то знаком. Однако, он пришел мне в голову буквально минут 30 назад (не украл ). Такого поиском вроде не нашел. Я его реализовал и проверил. Действительно, этот код дает возможность получения непредсказуемых (невоспроизводимых?) последовательностей! Для простоты сдел максимально просто. Класс позволяет получить случайный бит. 1 или 0.

На однопроцессорном компьютере такой алгоритм будет очень предсказуем. На многопроцессорных — тоже.

Хотя как ОДИН ИЗ способов собирать энтропию — пойдет, только результат надо будет комбинировать с другими источниками "непредсказуемости". Посмотрите как сделан /dev/random в Линуксе, например.
Sapienti sat!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.