Придумал способ получать действительно случайные числа
От: 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[2]: Придумал способ получать действительно случайные числ
От: McSeem2 США http://www.antigrain.com
Дата: 25.10.07 13:40
Оценка: 1 (1) +4
Здравствуйте, sikorsky, Вы писали:

S>Каждая идея имеет право на жизнь. Верно?


Не верно. К примеру, патентные бюро не принимают заявки по вечным двигателям. И правильно делают.
Другой пример:
Ландау был вынужден то и дело прерывать свои собственные исследования, 
поскольку ему нужно было разбирать десятки ошибочных доказательств, 
поступавших к нему на стол каждый месяц. Чтобы справиться с ситуацией, 
профессор Ландау изобрел изящный метод, позволивший избавиться от докучливой 
работы. Профессор попросил напечатать несколько сотен карточек, на которых 
значилось:

Уважаемый(ая)     .   .   .   .   .   .   .   .

Благодарю Вас за присланную Вами рукопись с доказательством Великой теоремы Ферма. 
Первая ошибка находится на стр. ... в строке ... . Из-за нее все доказательство 
утрачивает силу.
                                                                Профессор Ландау

Каждое из полученных доказательств вместе с отпечатанной карточкой Ландау вручал 
одному из своих студентов и просил его заполнить пробелы.


S>Мне все-равно, правильно работает этот алгоритм или нет. Сейчас у меня вообще нет такой задачи. Т.е. лично мне он не нужен.


Не кажется ли тебе, что подобное отношние является элементарным неуважением (даже некоторым пренебрежением) к другим участникам беседы?

S>Все что я хотел узнать, выкладывая его сюда, это его теоретическая пригодность. Чтобы ее присутсвие или отсутствие доказали.


А зачем? Ты, исходя из ложной предпосылки, накосячил кривого кода, и хочешь, чтобы тебе чего-то доказывали? А оно кому-то надо?
Ложная предпосылка заключается в том, что ты считаешь планировщик задач истинно стахостическим процессом. А это не так. Планировщик очень и очень детерминирован. Даже при полной загрузке сотней процессов занимающихся разной работой.

S>ЗЫ. БОЛЬШЕ ВСЕГО не люблю когда люди говорят что-то просто для того чтобы сказать. Без обоснования. Потому прошу свое мнение чем-то подкреплять.


А люди не любят, когда некоторые, не разобравшись в теме, начинают выдавать всякую лабуду за великое откровение. Такие дела.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[6]: Придумал способ получать действительно случайные числ
От: Кодт Россия  
Дата: 25.10.07 12:30
Оценка: +4
Здравствуйте, sikorsky, Вы писали:

S>Я "кипятишься" потому что ни один не привел хоть сколько нибудь стоящих замечаний. Просто пустые слова. А я люблю конструктивную критику. Люблю. Я бы хотел прочитать что-то вроде "...этот код не работает так как ты ожидаешь, потому как...". Лан, нет смысла продолжать.


Я тебе конструктивно покритиковал в двух местах:
— некачественный ГСЧ сам по себе (в том виде, какой ты предоставил), заклинивающийся в половине всех испытаний
— используешь в качестве источника шума очень низкочастотный, более-менее регулярный и легко компрометируемый сигнал (переключатель потоков)
И что-то не дождался от тебя конструктивных ответов.

S>А на счет "никому не нужен", так не говори за всех. Такие проблемы стоят перед каждым, кто занимается защитой, моделирование естеств. процессов и т.д. И услышать такую идею могло бы быть полезно для этих людей.


Тех, кто занимается этими делами серьёзно, — такое решение своих проблемы заведомо не удовлетворит. Лучше уж /dev/random использовать.
А тех, кто этими вопросами балуется — тем более /dev/random.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Придумал способ получать действительно случайные числа
От: Кодт Россия  
Дата: 25.10.07 10:53
Оценка: 9 (3)
Здравствуйте, sikorsky, Вы писали:

<>

Замечание по коду.

Выглядит издевательством хранить последовательность битов в строке, по символу на бит.
А ещё — реализацию алгоритма вывода бита из строки можно резко упростить (не трогая саму идею).

Ты считаешь баланс количества переходов _- и -_
Но очевидно, что в строке вида _----___-_--....-_-_--- можно сделать сокращения, не влияющие на итог:
1) идущие подряд уровни (серии нулей или единиц) свести к одиночным
2) все внутренние переходы 01 и 10 уравновешены: 0101 == 01,10,01 == 01, 1010 == 10,01,10 == 10.
Таким образом, баланс переходов равен единственному переходу от первого символа к последнему.

Значит,
1) можно хранить только первый и последний символы. Причём первый символ порождается единожды при старте (какой поток успеет это сделать), а второй — перезаписывается обоими потоками.

2) нужно рассмотреть небольшое количество вариантов
"" — запрос бита, когда оба потока ещё ничего не написали. Баланс равен 0, на выходе 1.
"0", "1" — тоже ранний запрос. Баланс равен 0, на выходе 1.
"00". Баланс равен 0, на выходе 1
"01". Баланс равен +1 (b01 > b10), на выходе 0.
"10". Баланс равен -1 (b01 < b10), на выходе 1.
"11". Баланс равен 0, на выходе 1.

Таким образом, если первый бит "1", то на выходе всегда будут 1.
Офигенно случайный алгоритм получился
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Придумал способ получать действительно случайные числ
От: deniok Россия  
Дата: 24.10.07 14:05
Оценка: 1 (1) +2
Здравствуйте, sikorsky, Вы писали:


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


Шедулер OS (тот, кто в действительности переключает потоки, причём исходя из вполне детерминированного алгоритма) — весьма убог как рандомизатор. В вашей выходной строке наверняка будет куча корреляций.
Re[3]: Придумал способ получать действительно случайные числ
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.10.07 18:19
Оценка: :)))
Здравствуйте, deniok, Вы писали:

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


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


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

G>>А как ты проверял что 50 на 50. У меня всего 1000 чисел минут 8 генерировались, и все единицы.

D>Ну вот, а здесь
Автор: Flamer
Дата: 24.10.07
сплошные нули. Случайность — налицо


Я понял смыл: на 50% компьютеров единицы, на 50% — нули
Re[5]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 25.10.07 11:03
Оценка: :)))
Здравствуйте, CreatorCray, Вы писали:
CC>Чего ж ты тогда так кипятишься когда тебе говорят что код, который ты выложил — лажа?

Я "кипятишься" потому что ни один не привел хоть сколько нибудь стоящих замечаний. Просто пустые слова. А я люблю конструктивную критику. Люблю. Я бы хотел прочитать что-то вроде "...этот код не работает так как ты ожидаешь, потому как...". Лан, нет смысла продолжать.

А на счет "никому не нужен", так не говори за всех. Такие проблемы стоят перед каждым, кто занимается защитой, моделирование естеств. процессов и т.д. И услышать такую идею могло бы быть полезно для этих людей.

Жаль, что очень мало людей может что-то сказать по теме (не только по этой, а по любой)...
Re[5]: Придумал способ получать действительно случайные числ
От: Cyberax Марс  
Дата: 25.10.07 09:32
Оценка: 16 (2)
Здравствуйте, Нахлобуч, Вы писали:

C>>Почитайте, например, как американцы вскрывали наши one-time pad'ы из-за дефектного ГСЧ.

Н>Шай-бу! Шай-бу! (зачеркнуто) Ссыл-ку! Ссыл-ку!
http://en.wikipedia.org/wiki/VENONA_project

Подробности я читал давно в бумажном журнале. Если кратко: СССР часто использовал для генерации шифроблокнотов машинстку, которая просто случайно набирала на печатающей машинке буквы. Однако, это часто приводило к образованию предсказуемых последовательностей. А этого оказывалось часто вполне достаточно, чтобы восстановить текст, используя знание о структуре русского языка.
Sapienti sat!
Re[11]: Придумал способ получать действительно случайные чис
От: sikorsky Украина  
Дата: 24.10.07 16:10
Оценка: :))
Здравствуйте, nikov, Вы писали:

N>Современная квантовая механика базируется на постулате, что истинно случайные процессы все-таки есть.


Врут
Re: Придумал способ получать действительно случайные числа
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.10.07 18:13
Оценка: +1 -1
Здравствуйте, sikorsky, Вы писали:

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

А как ты проверял что 50 на 50. У меня всего 1000 чисел минут 8 генерировались, и все единицы.

код:
       static void Main(string[] args)
        {
            RealRnd rnd = new RealRnd();
            int[] c = new int[2];

            for (int i = 0; i < 1000; i++)
           {
                rnd.Compute();
                int r = rnd.RandomizedBit;
            c[r]++;
                
        }
            Console.WriteLine(c[0]);
            Console.WriteLine(c[1]);
            Console.ReadKey();
        }




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

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

S>Короче. Я так понял что все всЁ понимают очень буквально. ОК. Завтра заменю свойство РАндомайздБит чем-то более реальным. Интересно.


Короче. Я не юзал RandomizeBit. Я смотрел в RandomizedString — одни нули. ОК. Сегодня же прекратите. А то уже неинтересно.
<< Грустно, когда идешь на кладбище. И уж особенно грустно — когда там остаешься. >>
Re[2]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 25.10.07 10:55
Оценка: -2
Здравствуйте, Кодт, Вы писали:

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


К><>


К>Замечание по коду.


К>Выглядит издевательством хранить последовательность битов в строке, по символу на бит.


Ну что тут скажешь... Вы могли бы прочесть сначала что я писал
Re[2]: Придумал способ получать действительно случайные числ
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.10.07 13:50
Оценка: +2
Здравствуйте, sikorsky, Вы писали:

S>Искренне рад, что всех вас так повеселил )

Да уж


S>ЗЫ. БОЛЬШЕ ВСЕГО не люблю когда люди говорят что-то просто для того чтобы сказать. Без обоснования. Потому прошу свое мнение чем-то подкреплять.


Обоснование: два запуска программы выдали ОДИНАКОВЫЕ последовательности хешей (по 100 штук).

        static void Main(string[] args)
        {
            RealRnd rnd = new RealRnd();
            int[] c = new int[2];

            for (int i = 0; i < 100; i++)
            {
                rnd.Compute();
                Console.WriteLine(rnd.RandomizedHash);
            }
            Console.ReadKey();
        }


С таким же успехом можно выдавать хеши от последовательности букв алфавита.
Останусь при своем мнении: идея — говно.
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]: Придумал способ получать действительно случайные числ
От: Ravlyk Австралия http://stitcharteasy.com
Дата: 25.10.07 09:28
Оценка: 1 (1)
Здравствуйте, sikorsky, Вы писали:

Во-первых, в начале метода Compute() поставте:
    _rnd.Length = 0;

Ато строка в StringBuilder растет при каждом запросе вычисляемого "случайного" значения.

Во-вторых, я позапускал вот такой код:
    internal class Program
    {
        private static void Main()
        {
            RealRnd rnd;
            rnd = new RealRnd();
            List<int> values = new List<int>();
            for (int i = 0; i < 100; i++)
            {
                rnd.Compute();
                int hashCode = rnd.RandomizedHash.GetHashCode();
                if (!values.Contains(hashCode))
                    values.Add(hashCode);
            }
            Console.WriteLine(values.Count.ToString());
            Console.ReadLine();
        }
    }

Если бы это был нормальных ГСЧ, то на экран вывело бы 100 (ну ладно еще 99),
а выводило числа от 60 до 95, что говорит об ОЧЕНЬ частой повторяемости ваших "случайных" значений.
Re: Придумал способ получать действительно случайные числа
От: Константин Россия  
Дата: 24.10.07 13:23
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

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


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



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

Если на эти вопросы ответа нет, то в библиотеку и читать Кнута (или что-то подобное, по-вкусу)
Re: Придумал способ получать действительно случайные числа
От: Cyberax Марс  
Дата: 24.10.07 14:42
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

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

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

Хотя как ОДИН ИЗ способов собирать энтропию — пойдет, только результат надо будет комбинировать с другими источниками "непредсказуемости". Посмотрите как сделан /dev/random в Линуксе, например.
Sapienti sat!
Re[10]: Придумал способ получать действительно случайные чис
От: deniok Россия  
Дата: 24.10.07 14:48
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

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


Он хорош, если, грубо говоря, последовательность из 10 единиц (предположим, что выход — бинарный) встречается в нём с частотой 1/2^10.
Re[10]: Придумал способ получать действительно случайные чис
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 24.10.07 14:51
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

[]

S>+ тогда можно говорить о причино-следственной связи и тогда не нет в мире ничего случайного вообще. Я не шучу щас. И даже хардверные генераторы не случайны


Вот, почитайте: http://en.wikipedia.org/wiki/Diehard_tests
Или еще вот: http://leo.yuriev.ru/114
<< Люди, не умеющие лгать, являются социально неадаптированными. >>
Re[3]: Придумал способ получать действительно случайные числ
От: Cyberax Марс  
Дата: 24.10.07 15:17
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

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

S>Мне все-таки было бы интересно узнать конкретно как его можно предсказать?
Прогнать алгоритм на похожем компьютере — и посмотреть что получаться будет.

Для криптоатаки часто будет достаточно знания поведения последовательности "случайных" чисел. Почитайте, например, как американцы вскрывали наши one-time pad'ы из-за дефектного ГСЧ.

C>>Посмотрите как сделан /dev/random в Линуксе, например.

S>Не буду смотреть так как не в этом дело..
-1, непризнаный гений.
Sapienti sat!
Re[3]: Придумал способ получать действительно случайные числ
От: Константин Россия  
Дата: 24.10.07 16:53
Оценка: +1
Здравствуйте, sikorsky, Вы писали:


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

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

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

Бог весть какой секрет

А всё-таки интересно было бы узнать насколько же случайной получается последовательность.
Есть разные тесты для проверки случайности. Интересно было бы глянуть какие проходятся, а какие нет.
Иначе ценность даже не нулевая, а отрицательная. За использования генератора без известных характеристик
нужно (убивать, закапывать, кастрировать, гладить по головке, повышать в должности, давать в морду)-ненужное зачеркнуть.
Re[2]: Придумал способ получать действительно случайные числ
От: deniok Россия  
Дата: 24.10.07 18:18
Оценка: :)
Здравствуйте, gandjustas, Вы писали:

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


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

G>А как ты проверял что 50 на 50. У меня всего 1000 чисел минут 8 генерировались, и все единицы.

Ну вот, а здесь
Автор: Flamer
Дата: 24.10.07
сплошные нули. Случайность — налицо
Re[3]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 25.10.07 07:31
Оценка: +1
Здравствуйте, Flamer, Вы писали:

S>>Короче. Я так понял что все всЁ понимают очень буквально. ОК. Завтра заменю свойство РАндомайздБит чем-то более реальным. Интересно.

F>Короче. Я не юзал RandomizeBit. Я смотрел в RandomizedString — одни нули. ОК. Сегодня же прекратите. А то уже неинтересно.
Через это крайне интересует вопрос: а аффтар свой алгоритм вообще тестировал?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 25.10.07 09:48
Оценка: :)
Здравствуйте, Ravlyk, Вы писали:


R>Во-первых, в начале метода Compute() поставте:

R>
R>    _rnd.Length = 0;
R>

R>Ато строка в StringBuilder растет при каждом запросе вычисляемого "случайного" значения.

Та это ерунда... Нет времени доделывать
Re[4]: Придумал способ получать действительно случайные числ
От: Ravlyk Австралия http://stitcharteasy.com
Дата: 25.10.07 10:41
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

S>Там потоки не синхр., потому могут быть случаи, что второй поток еще работает, а свойство заново считывается...


Ага, сделал принудительное ожидание до завершения всех потоков — совпадений стало еще больше

S>Но у меня нет времени проверять.


Ну так нечего тогда категорически утверждать что придумали способ который действительно...
Re[3]: Придумал способ получать действительно случайные числ
От: Кодт Россия  
Дата: 25.10.07 11:55
Оценка: +1
Здравствуйте, sikorsky, Вы писали:

К>>Выглядит издевательством хранить последовательность битов в строке, по символу на бит.


S>Ну что тут скажешь... Вы могли бы прочесть сначала что я писал


Что именно? Ссылку или цитату покажи, где опровергаются мои утверждения, что у тебя
1) жесточайше расточительная реализация...
2) ...алгоритма, который в половине случаев заклинивается на единице.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Придумал способ получать действительно случайные числа
От: e-garin Россия  
Дата: 24.10.07 13:16
Оценка:
Здравствуйте, sikorsky, Вы писали:

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


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


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

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


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


Таки объясните, где же у Вас тот самый источник "действительной случайности", который не позволит "предсказать" и "воспроизвести" последовательность человеку, знающему приведенный Вами код? (ведь случайность не может опираться на незнание алгоритма генерации (псевдо)случайного числа или его запутанность — должна быть какая-то "тайна", а здесь её что-то не видно )
А мне нравится жить :).
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]: Придумал способ получать действительно случайные числ
От: 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[2]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 14:45
Оценка:
Здравствуйте, Cyberax, Вы писали:

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


Мне все-таки было бы интересно узнать конкретно как его можно предсказать?

C>Посмотрите как сделан /dev/random в Линуксе, например.

Не буду смотреть так как не в этом дело..
Re[11]: Придумал способ получать действительно случайные чис
От: sikorsky Украина  
Дата: 24.10.07 14:52
Оценка:
Здравствуйте, deniok, Вы писали:

D>Он хорош, если, грубо говоря, последовательность из 10 единиц (предположим, что выход — бинарный) встречается в нём с частотой 1/2^10.


Так а о том и речь, что вряд-ли предложенный алгоритм способен сгенерировать подряд 10 одинаковых строк длинной 20 000 символов. Да даже и две. А уж как эти разные строки привести к удобному выводимому результату (например, к 0м и 1м), это другой вопрос. Главное, что за основу берется непредсказуемая штука, а не, как в случае с систем.рандом, текущее время (если, конечно, не определено другое)
Re[10]: Придумал способ получать действительно случайные чис
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.10.07 14:58
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>+ тогда можно говорить о причино-следственной связи и тогда не нет в мире ничего случайного вообще. Я не шучу щас. И даже хардверные генераторы не случайны


Современная квантовая механика базируется на постулате, что истинно случайные процессы все-таки есть.
Re[12]: Придумал способ получать действительно случайные чис
От: deniok Россия  
Дата: 24.10.07 15:39
Оценка:
Здравствуйте, sikorsky, Вы писали:

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


D>>Он хорош, если, грубо говоря, последовательность из 10 единиц (предположим, что выход — бинарный) встречается в нём с частотой 1/2^10.


S>Так а о том и речь, что вряд-ли предложенный алгоритм способен сгенерировать подряд 10 одинаковых строк длинной 20 000 символов. Да даже и две. А уж как эти разные строки привести к удобному выводимому результату (например, к 0м и 1м), это другой вопрос. Главное, что за основу берется непредсказуемая штука, а не, как в случае с систем.рандом, текущее время (если, конечно, не определено другое)


Вопрос как раз в мере непредсказуемости. Для идеального источника "случайности" энтропия должна быть максимальна. Тебе уже приводили ссылки на тесты — погоняй результаты своего генератора на приличном test suite. А ещё лучше — почитай учебники.
Re[4]: Придумал способ получать действительно случайные числ
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 24.10.07 17:29
Оценка:
Здравствуйте, Константин, Вы писали:

[]

К>А всё-таки интересно было бы узнать насколько же случайной получается последовательность.

К>Есть разные тесты для проверки случайности. Интересно было бы глянуть какие проходятся, а какие нет.
К>Иначе ценность даже не нулевая, а отрицательная. За использования генератора без известных характеристик
К>нужно (убивать, закапывать, кастрировать, гладить по головке, повышать в должности, давать в морду)-ненужное зачеркнуть.

Да чего там проверять Создал я Win Application в 2003 студии, добавил туда этот класс случайных чисел, переделал вывод в файл. В файле — 19 Кб одних нулей. И так при каждом вызове. Запускал из под студии прямо. Супер случайные числа Разбираться в чем дело не стал (подозреваю, что поток не отрабатывал, ну да плевать), но это показывает степень "случайности чисел", получаемых таким алгоритмом.
<< Рабство не отменено — оно сменилось 8-часовым рабочим днем. >>
Re[2]: Придумал способ получать действительно случайные числ
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 24.10.07 18:16
Оценка:
Здравствуйте, gandjustas, Вы писали:


G>А как ты проверял что 50 на 50. У меня всего 1000 чисел минут 8 генерировались, и все единицы.


Угу, вот и у меня похожая ситуёвина: Re[4]: Придумал способ получать действительно случайные числ
Автор: Flamer
Дата: 24.10.07


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

G>Говно

Пожалуй, буду краток: согласен.
<< Если человек рождается бедным и некрасивым, то в дальнейшем он имеет много шансов развить оба этих качества. >>
Re[2]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 24.10.07 21:06
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


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

G>А как ты проверял что 50 на 50. У меня всего 1000 чисел минут 8 генерировались, и все единицы.

G>код:

G>
G>       static void Main(string[] args)
G>        {
G>            RealRnd rnd = new RealRnd();
G>            int[] c = new int[2];

G>            for (int i = 0; i < 1000; i++)
G>           {
G>                rnd.Compute();
G>                int r = rnd.RandomizedBit;
G>            c[r]++;
                
G>        }
G>            Console.WriteLine(c[0]);
G>            Console.WriteLine(c[1]);
G>            Console.ReadKey();
G>        }
G>




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

G>Говно

Мда... Для начала можно было просто потрудиться и прочитать, что RandomizedBit просто пример! Суть не в этом свойстве.
Re: Придумал способ получать действительно случайные числа
От: sikorsky Украина  
Дата: 24.10.07 21:09
Оценка:
Короче. Я так понял что все всЁ понимают очень буквально. ОК. Завтра заменю свойство РАндомайздБит чем-то более реальным. Интересно.
Re: Придумал способ получать действительно случайные числа
От: baily Россия  
Дата: 25.10.07 07:24
Оценка:
Здравствуйте, sikorsky, Вы писали:

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


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


Неиссякает поток Кулибиных, шлющих свои доказательства об изобретении вечного двигателя, о решении теоремы Ферма, и т.д и т.п. При этом у всех таких доказательств есть общее свойство, что в них не используется ничего сложнее, чем перенос в уравнении из левой части в правую, а у авторов отсутствует знакомство с элементарными работами, посвященными данному вопросу
Re[3]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 25.10.07 07:31
Оценка:
Здравствуйте, sikorsky, Вы писали:

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

G>>Говно
Согласен с предыдущим оратором

S>Мда... Для начала можно было просто потрудиться и прочитать, что RandomizedBit просто пример! Суть не в этом свойстве.

Вообще то принято выкладывать алгоритмы в завершенном виде. Т.е. раз это генератор случайных чисел то у него обязательно должна быть функция, которая возвращает конечный результат. В данном случае некое случайное значение.
Так что отмазка не прокатила.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Придумал способ получать действительно случайные числ
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 25.10.07 07:39
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Почитайте, например, как американцы вскрывали наши one-time pad'ы из-за дефектного ГСЧ.


Шай-бу! Шай-бу! (зачеркнуто) Ссыл-ку! Ссыл-ку!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
Re: Придумал способ получать действительно случайные числа
От: sikorsky Украина  
Дата: 25.10.07 08:20
Оценка:
Искренне рад, что всех вас так повеселил )

Постараюсь одним махом ответить сразу всем, т.к. персонально запарюсь... Этот алгоритм -- всего лишь на скорую руку реализованная идея, которая пришла мне в голову под конец рабочего дня. Идея состояла в том, чтобы использовать непредсказуемость (если кто не согласен, прошу конкретных примеров предсказания) потоков при таком их использовании, когда они работают с одним и тем же ресурсом по очереди, однако в течении разных промежутков времени (квантов), продолжительность которых зависит от кучи условий, которые вряд ли можно воспроизвести. Тем более, что они заранее не известны.

Каждая идея имеет право на жизнь. Верно? Мне все-равно, правильно работает этот алгоритм или нет. Сейчас у меня вообще нет такой задачи. Т.е. лично мне он не нужен.

Все что я хотел узнать, выкладывая его сюда, это его теоретическая пригодность. Чтобы ее присутсвие или отсутствие доказали. А получаю кучу высококонструктивных и взвешенных высказываний типа "Аффтар..." уровня 10го класса (как в анекдоте про "Я креведко?!", просто смешно). Вроде взрослые все люди.

Возвращаясь к вчерашнему обещанию, привожу немного измененный код:

(и прошу на кусок текста внизу обратить внимание)

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


using System;

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

            rnd = new RealRnd();
            rnd.Compute();
            Console.WriteLine(rnd.RandomizedHash);
        }
    }
}


Класс:



using System;
using System.Text;
using System.Threading;
using System.Security.Cryptography;

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

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

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

        public string RandomizedHash
        {
            get
            {
                MD5 md5 = MD5.Create();

                byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(this.RandomizedString));
                return Encoding.UTF8.GetString(hash);
            }
        }

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

        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'); }
        }
    }
}


...кусок текста внизу...

Вот 10 случайных последовательностей, сгенерированных подряд:
0.;n<C˘yz8
1.NQ*U`A
2.㼀下␫๕賙
3.h~ 锈
4.g.1IK^
5.cw|K
6.l}eU_
7.,o@CF
8.V3+aY^y.
9.b<!W

Теперь еще 9. А 10ю прошу "угадать" тех кто говорит что этот алгоритм, который у вас перед глазами, такой предсказуемый:

0.NqƔw(W%
1. 3ʗ~I
2.>Į¡A<
3.N<hTeޓ1V
4.+?>
5.?lpxܝ!Yr
6.$nEsOe<Tv,
7.OM<1
8.pEᵞT_:
9. ??? угадай

ЗЫ. БОЛЬШЕ ВСЕГО не люблю когда люди говорят что-то просто для того чтобы сказать. Без обоснования. Потому прошу свое мнение чем-то подкреплять.
Re[2]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 25.10.07 09:17
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>Этот алгоритм -- всего лишь на скорую руку реализованная идея, которая пришла мне в голову под конец рабочего дня.


S> Идея состояла в том, чтобы использовать непредсказуемость (если кто не согласен, прошу конкретных примеров предсказания) потоков при таком их использовании, когда они работают с одним и тем же ресурсом по очереди, однако в течении разных промежутков времени (квантов), продолжительность которых зависит от кучи условий, которые вряд ли можно воспроизвести. Тем более, что они заранее не известны.

В таком случае тему надо было назвать не "Придумал способ получать действительно случайные числа", что звучит как претензия на качественный ГСЧ.

S>Все что я хотел узнать, выкладывая его сюда, это его теоретическая пригодность.

Непригоден ни для чего серьезного.

S> Чтобы ее присутсвие или отсутствие доказали.

Оплачивай анализ. Просто так тебе никто серьезно доказывать применимость твоего алго как ГСЧ не будет. Равно как никто не берется за доказательства непригодности алгоритмов "шифрования", коими нередко пытаются осчастливить сообщество разные личности. Впрочем негодность большинства этих алгоритмов видна сразу.

S> А получаю кучу высококонструктивных и взвешенных высказываний типа "Аффтар..." уровня 10го класса (как в анекдоте про "Я креведко?!", просто смешно). Вроде взрослые все люди.

Угу, потому и советуют в результате одно и то же: иди почитай учебники по теме. А стебутся потому, что еслиб ты их все таки прочитал то этого топика бы не было бы вообще.

S>Возвращаясь к вчерашнему обещанию, привожу немного измененный код:

Ну добавил MD5. А толку то. С таким же успехом можно брать MD5 от результата GetTickCount() или rdtcs

S>0.;n<C˘yz8

S>1.NQ*U`A
S>2.㼀下␫๕賙
S>3.h~ 锈
S>4.g.1IK^
S>5.cw|K
S>6.l}eU_
S>7.,o@CF
S>8.V3+aY^y.
S>9.b<!W
Ох матерь тетерь! Что такое HEX наверное не в курсе...

Вот тебе ссылка http://en.wikipedia.org/wiki/Diehard_tests Выполни хотя бы их.
В следующих сообщениях ждемс анализа твоего ГСЧ.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 25.10.07 09:42
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Ох матерь тетерь! Что такое HEX наверное не в курсе...


Да уж... Куда мне...

CC>Вот тебе ссылка http://en.wikipedia.org/wiki/Diehard_tests Выполни хотя бы их.


Млин... Ну как объяснить что я не собираюсь никаких тестов устраивать потому как мне это не надо! Я могу потратить время, разработать корректный код, провести тесты. Самостоятельно убедиться работает он или нет. Но мне НЕ НУЖЕН этот класс! Я не могу позволить себе тратить столько времени впустую! Я выложил эту вещь чтобы тот, кому это надо, мог ее попробовать использовать и развивать. НЕвозможно это вам объяснить, я так понимаю. Если я выложил кусок кода, написанный на скорую руку, так сразу что, на докторскую степень претендую? Смешно. Просто смешно.
Re[3]: Придумал способ получать действительно случайные числ
От: sikorsky Украина  
Дата: 25.10.07 09:46
Оценка:
Здравствуйте, Ravlyk, Вы писали:

R>Если бы это был нормальных ГСЧ, то на экран вывело бы 100 (ну ладно еще 99),

R>а выводило числа от 60 до 95, что говорит об ОЧЕНЬ частой повторяемости ваших "случайных" значений.

Та я делал это.. Угу, много совпадений. Но они изчезают если между вызовами есть задержки. Там потоки не синхр., потому могут быть случаи, что второй поток еще работает, а свойство заново считывается... короче, просто недоделка.. это ведь просто проверка, а не "релиз"

Хотя, , возможно, даже если все сделать правильно, будет такая фигня. Будет означать тогда, что фиговый способ. Но у меня нет времени проверять.

Re[3]: Придумал способ получать действительно случайные числ
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 25.10.07 10:12
Оценка:
Здравствуйте, CreatorCray, Вы писали:

[]

Мне кажется, хватит стебаться над автором топика. Тем более, что он либо конкретно не понимает, что он нахватался вершков и несёт/постит откровенную чушь, либо просто сам стебается.
<< Не присоединяйся к нашему миру наркоманов: нас много, а наркоты мало. >>
Re[4]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 25.10.07 10:47
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>Млин... Ну как объяснить что я не собираюсь никаких тестов устраивать потому как мне это не надо!

А почему ты думаешь что другие будут тестировать твой алгоритм? На первый взгляд алгоритм говно, как тебе уже сказали. По попыткам использования — говно, о чем написали те кто пробовал. Чтобы сказать более точно надо проводить полноценные тесты. Ты их проводить не хочешь — другим это нафиг не упало.

S>Но мне НЕ НУЖЕН этот класс!

Он никому не нужен.

S>Я не могу позволить себе тратить столько времени впустую!

Не ты один.

S>Я выложил эту вещь чтобы тот, кому это надо, мог ее попробовать использовать и развивать.

Попробовали — говно.

S>НЕвозможно это вам объяснить, я так понимаю. Если я выложил кусок кода, написанный на скорую руку, так сразу что, на докторскую степень претендую? Смешно. Просто смешно.

Чего ж ты тогда так кипятишься когда тебе говорят что код, который ты выложил — лажа?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 25.10.07 10:47
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Мне кажется, хватит стебаться над автором топика.

Ну, в последнем посте я ничуть не стебался...

F> Тем более, что он либо конкретно не понимает, что он нахватался вершков и несёт/постит откровенную чушь

Скорее всего так.

F>либо просто сам стебается.

Вряд ли.

Но в целом да — смысла продолжать нет
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Придумал способ получать действительно случайные числ
От: Кодт Россия  
Дата: 25.10.07 10:53
Оценка:
Здравствуйте, sikorsky, Вы писали:

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

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

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

S>Можно ли более подробно. У вас есть число, полученное этим генератором. Пусть даже есть система, на которой оно получено. Каким образом вы сможете его воссоздать?

Фишка в следующем: а как именно ты собираешься пользоваться случайными числами.

1) Создавать на своей машине ключ
Но твоя последовательность — не совсем белый шум. Это детерминированный шум алгоритмического генератора, на который наложен очень низкочастотный шум планировщика.
Поэтому взломщик может искать ключи среди последовательности, порождаемой генератором, с учётом ноль-, одно- и двукратного переключения.
Либо твоя функция создания ключа должна работать очень долго, чтоб частота запросов каждого бита была сравнима (а то и заведомо меньше) частот планировщика.

2) Гарантировать, что на любой машине каждый запуск твоей программы даст неповторимый результат.
С ходу не могу придумать, зачем эта неповторимость нужна тебе, и зачем она может понадобиться взломщику. Но вдруг.
Тогда взломщик запускает твою программу под отладчиком и тормозит рабочий поток.
В результате программа становится детерминированной.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: Придумал способ получать действительно случайные числ
От: Константин Россия  
Дата: 25.10.07 11:34
Оценка:
Здравствуйте, sikorsky, Вы писали:

S>Но мне НЕ НУЖЕН этот класс!


Ну собственно на этом дискуссию можно и завершить.
Re[6]: Придумал способ получать действительно случайные числ
От: CreatorCray  
Дата: 25.10.07 11:35
Оценка:
Здравствуйте, sikorsky, Вы писали:

Не удержался...

S>Я "кипятишься" потому что ни один не привел хоть сколько нибудь стоящих замечаний. Просто пустые слова. А я люблю конструктивную критику. Люблю. Я бы хотел прочитать что-то вроде "...этот код не работает так как ты ожидаешь, потому как...". Лан, нет смысла продолжать.

Ок. этот код не работает так как ты ожидаешь, потому как ты понятия не имеешь как надо реализовывать ГСЧ.

S>А на счет "никому не нужен", так не говори за всех. Такие проблемы стоят перед каждым, кто занимается защитой, моделирование естеств. процессов и т.д. И услышать такую идею могло бы быть полезно для этих людей.

Я занимаюсь защитой.
С точки зрения криптографии ты написал абсолютно бесполезный алгоритм. То, что ты даже базовый набор тестов не прогнал говорит о многом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Придумал способ получать действительно случайные числа
От: a18 Россия  
Дата: 26.10.07 05:53
Оценка:
S>Действительно, этот код дает возможность получения непредсказуемых (невоспроизводимых?) последовательностей!
...
S>Ну что же, хотелось бы узнать мнения.

0. Сама идея (взаимодействие потоков) — вроде неплохая, НО:
1. По-видимому, это велосипед — см. раздел "ГПСЧ с источником энтропии" в статье про ГПСЧ
2. По-видимому, он с квадратными колёсами (судя по постам тех, кто пробовал)


А для тестирования можно для начала попробовать следующие простейшие тесты:
1) сгенерировать случайный бинарный файл порядка 1 МБ и попытаться сжать его хорошим архиватором — размер после сжатия должен _увеличиться_
2) использовать последовательные случайные числа как координаты для точек (X, Y) и выводить эти точки на экран. У хорошего генератора никаких "узоров" быть не должно.
3) посчитать количество цепочек ("серий") из идущих подряд нулей и единиц длины 1, 2, 3, ..., 20. Распределение количества таких серий должно быть логарифмическим.

Если всё это прокатит — тогда, как народ писал выше, можно прогнать тесты diehard.
Re[2]: Придумал способ получать действительно случайные числ
От: Mab Россия http://shade.msu.ru/~mab
Дата: 26.10.07 10:27
Оценка:
Здравствуйте, sikorsky, Вы писали:

Так или иначе, эта вся затея лишена смысла по следующей простой причине: совершенно не ясно, какое распределение будет на выходе данного генератора. Более того, понятно, что оно будет меняться в зависимости от конкретной машины, ее загруженности и погоды на Луне. И как его калибровать тогда, если мне нужно, скажем, равномерное распределение?

Подвергнуть такой генератор теоретическому изучению на предмет качества порождаемых им данных тоже нельзя. В отличие от датчиков, основанных на физических моделях, где соответствующая случайность представляет собой некий физический закон. И в отличие о псевдослучайных генераторов, где выход детерминирован, но его можно анализировать с точки зрения статистических тестов.

В общем, никакого применения здесь нет и быть не может. ГСЧ -- это вовсе не кусок куда, который делает непойми что "случайным" образом. Даже беглое знакомство с существующей теорией показало бы вам, что дело существенно сложнее.
Re: Придумал способ получать действительно случайные числа
От: vadimcher  
Дата: 08.11.07 15:45
Оценка:
Здравствуйте, sikorsky, Вы писали:

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


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


Сейчас сложилось общее мнение, что единственный способ получать "действительно случайные числа" (в противоположность к псевдослучайным числам), это использовать непредсказуемость физических процессов, описанных в квантовой механике. Например, даже в 70-е годы подобная идея была воплощена в игровой приставке (!) Atari. "Random numbers are generated on the Atari by measuring random noise on an electronic circuit..." Статья по этому поводу здесь.

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

Что качается псевдослучайных чисел, то есть серия тестов для проверки. Часть из них описана во втором томе Кнута. Ниже в ссылках я даю ссылку на программку для DOS, которая проверяет последовательность чисел различными методами на действительную случайность.

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

Мы все ждем отчета о Ваших результатах!

Ссылки:
[true random numbers]
Random numbers generated by the Atari
The randomness comes from atmospheric noise
LavaRND
общая статья из Wikipedia
[проверка на истинную случайность]
National Institute of Standards and Technology
random.zip = ent.exe
[истории из жизни]
как людей во Вьетнам отправляли

А вот зайца кому, зайца-выбегайца?!
Re[12]: Придумал способ получать действительно случайные чис
От: Warturtle  
Дата: 09.11.07 11:12
Оценка:
Здравствуйте, sikorsky, Вы писали:

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


N>>Современная квантовая механика базируется на постулате, что истинно случайные процессы все-таки есть.


S>Врут

Ты еще скажи: "Бог не играет в кости" — присоседишься к известному ретрограду.
Re[2]: Придумал способ получать действительно случайные числ
От: MegaVoltik  
Дата: 12.11.07 13:24
Оценка:
Вообщем идея уже реализована вот цитаты из вики:

Многие ГСЧ до сих пор используют традиционные (устаревшие) методы сбора энтропии такие как действия пользователя (движения мыши и т. п.), как например в PGP и Yarrow, или взаимодействие между потоками (threads), как например в Java secure random.

Java SecureRandom — источник энтропии: взаимодействие между потоками(threads); ГПСЧ: SHA-1 хэш внутреннего состояния (1024 бит); достоинства — в Java другого выбора пока нет, большое внутреннее состояние; недостатки: медленный сбор энтропии;

Чем больше нас, тем меньше их...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.