Чи випадковість фон Неймана в цитаті гріха вже не застосовується?


25

Деякий хлопець сказав наступне:

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

Це завжди означає, що ви не можете генерувати справжні випадкові числа лише за допомогою комп'ютера. І він сказав, що коли комп'ютери були еквівалентними розмірами одного мікропроцесора Intel 8080 (~ 6000 клапанів). Комп'ютери стали складнішими, і я вважаю, що вислів фон Фон Ноймана вже не може бути правдивим. Вважайте, що реалізований лише алгоритм програмного забезпечення неможливий. Вони працюють на фізичному обладнанні. Генератори справжніх випадкових чисел та їхні джерела ентропії також виготовлені з обладнання.

Цей фрагмент Java поміщено у цикл:

      file.writeByte((byte) (System.nanoTime() & 0xff));

я можу створити файл даних, який я представляв як зображення:

нанообраз

Ви можете бачити структуру, але також з великою кількістю випадковості. Цікавить, що цей файл PNG має розмір 232 КБ, але містить 250 000 пікселів сірого масштабу. Рівень стиснення PNG був максимальним. Це лише коефіцієнт стиснення 7%, тобто. досить не стисливий Що також цікаво, це те, що файл унікальний. Кожне покоління цього файлу має дещо інший малюнок і має схожу ~ 7% стисливість. Я підкреслюю це як важливе для мого аргументу. Це ентропія ~ 7 біт / байт. Це зменшиться, звичайно, при використанні більш сильного алгоритму стиснення. Але не зводити до нічого, що становить близько 0 біт / байт. Краще враження можна справити, взявши наведене вище зображення і замінивши його кольорову карту на випадкову: -

рандомізований нанообраз

Більша частина структури (у верхній половині) зникає, оскільки це були лише послідовності подібних, але незначно різних значень. Це справжнє джерело ентропії, створене просто виконанням програми Java в операційній системі, що приймає декілька? Не рівномірно розподілений генератор випадкових чисел, але джерело ентропії для одного? Джерело ентропії, побудований із програмного забезпечення, що працює на фізичному обладнанні, яке просто відбувається на ПК.

Доповнення

Для того, щоб підтвердити, що кожне зображення генерує свіжу ентропію без фіксованого шаблону, загального для всіх, було створено 10 послідовних зображень. Потім вони були об'єднані та стиснені найсильнішим архіватором, який я можу отримати для компіляції (paq8px). Цей процес дозволить усунути всі поширені дані, включаючи автоматичну кореляцію, залишивши лише зміни / ентропію.

Зв'язаний файл стискається до ~ 66%, що призводить до швидкості ентропії ~ 5,3 біт / байт або 10,5 Мбіт / зображення. Дивовижна кількість ентропії

Додатковий 2

Були негативні зауваження, що моя ентропія методологією тесту на стиск є хибною, лише даючи вільну оцінку верхньої межі. Тепер я запускаю зв'язаний файл, хоча офіційний тест оцінки криптографічної ентропії NIST - SP800-90B_EntropyAssessment . Це настільки ж добре, як і для вимірювання ентропії без IID. Це звіт (вибачте, це питання стає тривалим, але питання складне): -

Running non-IID tests...

Entropic statistic estimates:
Most Common Value Estimate = 7.88411
Collision Test Estimate = 6.44961
Markov Test Estimate = 5.61735
Compression Test Estimate = 6.65691
t-Tuple Test Estimate = 7.40114
Longest Reapeated Substring Test Estimate = 8.00305

Predictor estimates:
Multi Most Common in Window (MultiMCW) Test: 100% complete
    Correct: 3816
    P_avg (global): 0.00397508
    P_run (local): 0.00216675
Multi Most Common in Window (Multi MCW) Test = 7.9748
Lag 

Test: 100% complete
    Correct: 3974
    P_avg (global): 0.00413607
    P_run (local): 0.00216675
Lag Prediction Test = 7.91752
MultiMMC Test: 100% complete
    Correct: 3913
    P_avg (global): 0.00407383
    P_run (local): 0.00216675
Multi Markov Model with Counting (MultiMMC) Prediction Test = 7.9394
LZ78Y Test: 99% complete
    Correct: 3866
    P_avg (global): 0.00402593
    P_run (local): 0.00216675
LZ78Y Prediction Test = 7.95646
Min Entropy: 5.61735

У результаті NIST вважає, що я створив 5,6 біт / байт ентропії. Моя оцінка стиснення DIY ставить це в 5,3 біт / байт, дещо консервативніше.

-> Докази, схоже, підтверджують думку про те, що комп'ютер, що тільки працює з програмним забезпеченням, може генерувати реальну ентропію. І той фон Нойман помилявся (але, можливо, правильний для свого часу).


Я пропоную наступні посилання, які можуть підтвердити мою претензію: -

Чи існують якісь стохастичні моделі недетермінізму в швидкості виконання програми?

WCET Аналіз ймовірнісних жорстких систем реального часу

Чи існує алгоритм програмного забезпечення, який може генерувати недетерміновану модель хаосу? та актуальність хаотичних ефектів.

Паралелі з принципом квантової ентропічної невизначеності

Запис у блозі Олексія Шипільова щодо хаотичної поведінки nanoTime (). Його сюжет розсіювання не відрізняється від мого.


47
Я думаю, що ви помиляєтеся "Я не бачу закономірності" / щодня випадковість з математичною / стохастичною випадковістю.
Рафаель

3
@Raphael Я не хочу. Математичні алгоритми стиснення роблять. І який сенс операційних систем у режимі реального часу, якщо все програмне забезпечення завжди детерміновано? Я просто запитую про детерміналізм з точки зору бітів.
Пол Ушак

16
Ви плутаєте "на комп'ютері" і "з детермінованими засобами".
користувач253751

24
Ваша основна проблема тут полягає в тому, що ви починаєте з "я не розумію, як генерується ця закономірність" і робить висновок: "ніхто не може зрозуміти, як формується цей шаблон". Це неправильно. Враховуючи ваш профіль SE, ви, безумовно, досить добре знайомі з криптографією, щоб знати, що це не випливає. Розробити систему, яку ви не можете зламати, легко, але справжньою проблемою є розробити систему, яку не можуть зламати й інші.
Жиль "ТАК - перестань бути злим"

4
Я думаю, що більшість визначень "детермінованих" виключатиме алгоритми, які викликають System.nanoTime().
bmm6o

Відповіді:


75

Тільки тому, що ви не можете побачити шаблон, не означає, що не існує жодного шаблону. Тільки тому, що алгоритм стиснення не може знайти шаблон, не означає, що не існує жодного шаблону. Алгоритми стиснення - це не срібні кулі, які можуть магічно виміряти справжню ентропію джерела; все, що вони вам дають, - це верхня межа кількості ентропії. (Аналогічно, тест NIST також дає лише верхню межу.) Хаос - це не випадковість.

Щоб почати певну впевненість у якості випадкових випадків, отриманих таким чином, потрібен більш детальний аналіз та обстеження.

Там є підстави вважати , що ми , ймовірно , може отримати деяку кількість випадковості за рахунок використання тактового джиттера і дрейфу між двома апаратними годинами , але це тонка і складна, так що ви повинні бути обережні. Я б не рекомендував намагатися реалізувати свої власні. Натомість я б запропонував вам скористатися високоякісним джерелом ентропії (зазвичай це реалізується в більшості сучасних операційних систем). Докладніші відомості див. У Вікіпедії , тематичній картці та /crypto//q/48302/351 (яка, здається, ти вже знаєш).

Нарешті, коментар до вашого відкривача:

"Кожен, хто намагається генерувати випадкові числа детермінованими засобами, звичайно, живе в стані гріха".

Це завжди означає, що ви не можете генерувати справжні випадкові числа лише за допомогою комп'ютера.

Ні, це не так, як це прийнято, і це не те, що він говорить. Це означає, що не можна генерувати справжні випадкові числа детермінованими засобами . Чи можна це зробити на комп’ютері, залежить від того, детермінований він чи ні. Якщо комп'ютер детермінований або ваша програма використовує лише детерміновані операції, ви не можете. Однак багато комп'ютерів містять недетерміновані елементи, і якщо ваша програма їх використовує, потрібен більш детальний аналіз, перш ніж ви зможете вирішити, чи можна їх використовувати для генерації випадкових чисел. У вашому випадку nanoTime()недетермінований.


6
Для розширення на точку алгоритму стиснення PNG, як і більшість алгоритмів стиснення, шукає шаблони в даних. Алгоритм, який шукає малюнки змін даних, швидше за все, стисне прикладне зображення.
Марк

1
@Mark - на насправді, PNG робить аналіз закономірностей у змінах (вона використовує Deflate стиснення прикладається до різниці між фактичним значенням пікселя , а вихідний сигнал одного з ряду евристики передбачення, засновані на типах зміни вже бачили в зображенні) проте проведений аналіз є досить спрощеним, оскільки він був розроблений таким чином, щоб він міг ефективно працювати на вбудованих пристроях протягом 90-х. Більш цікавим питанням буде те, наскільки точним може бути алгоритм стиснення втрат, наприклад, яка помилка RMS JPEG або якесь фрактальне стиснення застосовано до зображення?
Жуль

3
@Jules: Що важливо, це не те, що PNG спрощений, а те, що він призначений для стиснення видів шаблонів, які, ймовірно, з'являться у багатьох видах зображень. Якби ви зробили типовий малюнок, наприклад, 123x234 пікселів і змінили його на 234x123, зберігаючи пікселі в тому ж порядку (тому перший рядок нової картинки містив 123 пікселі з верхнього ряду старого, плюс 111 пікселів другий рядок, наступний рядок нової картинки містив останні 12 пікселів початкового другого рядка, весь початковий третій рядок, і 99 четвертого, і т. д. PNG мав би ...
supercat

1
... ймовірно, не буде стискати отриману картинку майже так само добре, як оригінал, оскільки більше рядків між рядками більше не буде однакових просторових відносин, незважаючи на те, що друге зображення містило б такі самі пікселі, в точно такому ж порядку, як і спочатку.
supercat

100

Якщо ви використовуєте апаратне джерело ентропії / випадковості, ви не «намагаєтеся генерувати випадковість детермінованими засобами» (мій акцент). Якщо ви не використовуєте жодного апаратного джерела ентропії / випадковості, тоді більш потужний комп'ютер означає, що ви можете скоїти більше гріхів за секунду.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
DW

20

Я завжди розумів, що цитата означає, що детермінований алгоритм має фіксовану кількість ентропії, і хоча результат може здаватися "випадковим", він не може містити більше ентропії, ніж надають вхідні дані. З цієї точки зору ми бачимо, що ваш алгоритм протікає в ентропії через System.nanoTime()- більшість визначень "детермінованого" алгоритму забороняє викликати цю функцію.

Цитата - хоча піти - це по суті тавтологія. Нічого тут не може спростувати, і неможливо еволюціонувати апаратне забезпечення, що може зробити його більше неправдою. Не про апаратне забезпечення, а про визначення детермінованого алгоритму. Він просто зауважує, що детермінізм і випадковість несумісні. Для будь-якого детермінованого алгоритму вся його поведінка прогнозується його початковими умовами. Якщо ви думаєте, що знайшли виняток, ви нерозумієте, що означає бути детермінованим.

Це правда, що процес, що працює на спільному комп'ютері зі складною серією кеш-пам'яті і який отримує різні мережеві та апаратні входи, має доступ до значно більшої ентропії, ніж той, що працює на простому, ізольованому, виділеному апаратному забезпеченні. Але якщо цей процес отримує доступ до тієї ентропії, він більше не детермінований, і тому цитата не застосовується.


Після відображення (не типу Java) я не впевнений, що потрібен nanoTime (). Це була лише стопова стрічка ersatz для відстеження прогресу петлі, що її оточує. Якщо nanoTime () було видалено, я вважаю, що швидкість виконання циклу (без прямих викликів апаратного забезпечення) також не буде детермінованою, оскільки це програмне забезпечення, яке все ще взаємодіє з середовищем комп'ютера. Це вся основа програмування в режимі реального часу на вбудованому наборі. Я досить переконаний, що цитата фон Неймана більше не застосовується до сучасного комп’ютера.
Пол Ушак

1
@PaulUszak Скільки разів я маю це сказати? Фон Нойман каже, що ви не можете детерміновано генерувати випадкові числа. Ви постійно твердите, що Фон Нойман помиляється, тому що ви можете використовувати недетермінізм. Ви ніби неодноразово стверджуєте, що твердження "піти від Парижа до Берліна потрібно дуже багато часу" не застосовується в сучасному світі, оскільки ти можеш літати між цими двома містами. І що? Цитата про ходьбу, і це ще триває багато часу. Цитата Фон Ноймана стосується детермінованих систем, і вони все ще не можуть працювати випадковим чином.
Девід Річербі

1
@PaulUszak Це буквально неможливо. Якщо ви думаєте, що у вас є детермінований алгоритм, поведінка якого не визначається його вхідними даними, це просто питання визначення місця введення ентропії.
bmm6o

18

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

Коли ви трактуєте "життя в стані гріха" як "творення дурниці", то це абсолютно правильно.

Що ви зробили, це використання досить повільного методу System.nanoTime()для створення досить слабкої випадковості. Ви щось виміряли

... швидкість ентропії ~ 5,3 біт / байт ...

але це лише верхня межа. Все, що ви можете отримати, - це верхня межа. Справжня ентропія може бути на порядок меншою.

Спробуйте замість цього заповнити масив за допомогою криптографічного хеша, як MD5. Обчисліть подібну послідовність md5(0), md5(1), ...(з кожного значення, взятого одного або декількох байтів, це не має значення). Ви взагалі не отримаєте стиснення (так, MD5 зламаний, але все ще достатньо хороший для отримання нестислимих даних).

Можна сказати, що ентропії взагалі немає, але ви б виміряли 8 біт / байт.

Коли вам дійсно потрібно щось випадкове, вам не тільки доведеться використовувати джерело HW, ви також повинні знати впевнену нижню межу того, скільки ентропії воно справді виробляє. Хоча там, швидше за все, є якась випадковість nanoTime(), я не знаю жодної нетривіальної нижньої межі.

Коли вам потрібна випадковість для криптографії, тоді вам дійсно доведеться вдатися до чогось, що надається вашою ОС, вашою мовою чи гарною бібліотекою. Такі постачальники збирають ентропію з декількох джерел та / або виділених HW, і досить багато робіт було вкладено в такі оцінки ентропії.

Зауважте, що зазвичай вам майже не потрібна ентропія. Хороший (детермінований) PRNG, ініціалізований з кількома випадковими байтами, є корисним для криптографії, а отже, і для всього іншого.


4
@PaulUszak Звичайно, детермінований PRNG не може використовуватися як OTP. Але OTP - дуже особливий випадок, оскільки він за визначенням вимагає справді випадкового ключа. AFAIK для будь-якого іншого достатньо випадкового насінного безпечного PRNG (насіння має мати, наприклад, 128 або 256 біт ентропії, залежно від необхідного рівня безпеки).
maaartinus

3
"Коли вам дійсно потрібно щось випадкове" → Ви, як правило, ніколи не потребуєте справжньої випадковості. Швидше, вам потрібна відсутність кореляції. Справжня випадковість є надійною гарантією, але в основному кожен випадок так само добре задоволений сучасним CSPRNG та непередбачуваним насінням.
Ведрак

3
@maaartinus Ви мене не зовсім отримуєте. Я кажу, що вам не потрібні справжні випадкові насіння, вам просто потрібні непередбачувані некорльовані насіння.
Ведрак

6
Як приклад, я створив текстовий файл з 1 мільйоном послідовних номерів. gzipвдалося отримати лише 63% стиснення, хоча ентропії майже немає. Він міг виявити лише такі повтори, як999919999299993...
Бармар

6
@PaulUszak Це був мій погляд - коефіцієнт стиснення не є хорошим показником ентропії, він вказує, чи здатний конкретний алгоритм стиснення виявити тип шаблонів, які містять ваші дані.
Бармар

14

Я думав, що я задзвонюватимуться на значенні "випадкового". Більшість відповідей тут говорять про вихід випадкових процесів , порівняно з результатами детермінованих процесів. Це абсолютно гарне значення "випадкового", але це не єдине.

Одна з проблем виходу випадкових процесів полягає в тому, що їх важко відрізнити від результатів детермінованих процесів: вони не містять "запису" того, наскільки випадковим було їх джерело. Надзвичайним прикладом цього є відомий комікс XKCD, де генератор випадкових чисел завжди повертається 4, з коментарем коду, який стверджує, що це випадково, оскільки він прийшов із штампу.

Альтернативний підхід до визначення "випадковості", який називається складністю Колмогорова , заснований на самих даних, незалежно від того, як вони були створені. Складність Колмогорова деяких даних (наприклад, послідовність чисел) - це довжина найкоротшої комп'ютерної програми, яка виводить ці дані: дані "більш випадкові", якщо вони мають більшу складність Колмогорова.

Ваше використання алгоритмів стиснення, таких як PNG, і порівняння довжини до і після стиснення, аналогічно ідеї складності Колмогорова. Однак складність Колмогорова дозволяє кодувати дані як програму на будь-якій мові програмування, повністю завершеній Тьюрінгом, а не в обмеженому форматі, як PNG; "декомпресія" таких кодувань (програм) виконується шляхом їх запуску, що може зайняти довільну кількість часу та пам'яті (наприклад, більше, ніж є в нашому шаленому Всесвіті).

Теорема Райса говорить про те, що ми взагалі не можемо розрізняти програми, які циклічно вічно, і програми, які виводять наші дані. Отже, складність деяких даних Колмогорова дуже складно знайти: якщо ми запишемо програму, яка генерує ці дані, насправді може бути коротша програма (тобто менша складність), але ми її не помітили, оскільки не змогли відрізнити її від нескінченної петлі. Отже, складність Колмогорова є непорушною, хоча, якби ми знали числа Busy-Beaver, ми могли б обчислити їх, використовуючи ті, щоб обмежити кількість часу, яке ми перевіряємо для кожної програми.

У випадку ваших прикладних даних, щоб знайти його складність Колмогорова (тобто "внутрішню випадковість"), нам знадобиться знайти найкоротшу детерміновану програму, яка виводить ту саму послідовність байтів, і приймає її довжину.

Тепер ми можемо відповісти на ваше запитання з точки зору складності Колмогорова, і ми виявимо, що цитата є правильною: ми не можемо генерувати випадкові числа (висока складність Колмогорова) детермінованими засобами.

Чому ні? Уявімо собі, що ми пишемо невелику комп’ютерну програму і використовуємо її для створення послідовності випадкових чисел. Необхідно застосувати одну з наступних ситуацій:

  • Ми генеруємо величезну кількість продукції. Однак, оскільки ми знаємо, що цей вихід генерується невеликою програмою, вихід (за визначенням) має низьку складність Колмогорова, а значить, у цьому сенсі він не є «випадковим».
  • Ми генеруємо так мало цифр, що їх записування зайняло б приблизно однакові або навіть менші біти, ніж записування нашої короткої програми генерування. У цьому випадку цифри є відносно нестислимими, що вказує на те, що вони досить випадкові в значенні Колмогорова. Однак, оскільки обсяг випуску є порівнянним з тим, що ми вкладаємо (вихідний код програми), справедливо сказати, що програма не "генерувала" випадковість, ми це зробили, вибравши цю програму. Зрештою, в цьому випадку наша програма, що генерує, могла бути також лише переліком цих точних чисел (наприклад print([...])).

У будь-якому випадку ми не «генеруємо» більше випадковості, ніж ми вкладаємо («випадковість» вихідного коду нашої програми). Ми можемо спробувати подолати це за допомогою більш тривалої програми, що генерує, щоб уникнути виходу короткого генератора, але для цього є лише два способи:

  • Систематично "роздути" код якимось чином. Однак, Колмогоров складність не дбає про конкретну програму, ми використовували для генерації даних: він тільки дбає про який генерації програми є найменшим. Систематичне роздуття не додає складності Колмогорову, тому що такі шаблони в коді самі по собі можуть генеруватися при дуже невеликій кількості коду. Наприклад, якщо взяти run(shortGenerator)і додати цілий набір систематичного набряку, щоб отримати run(bloatedGenerator), короткий генератор все ще існує у формі run(addBloat(shortGenerator)).
  • Додайте розрив несистематично , тобто без будь-яких шаблонів, так що addBloatфункція повинна була б бути такою ж роздутою, як і сам код. Однак бути таким позбавленим шаблонів саме те, що робить щось випадковим (велика складність Колмогорова). Отже, роздуття програми, що генерує таким чином , збільшує випадковість (складність Колмогорова) виводу, але також збільшує кількість випадковості (складність Колмогорова), яку ми маємо надати у вигляді вихідного коду. Отже, ми все ще надаємо "випадковість", а не програму. У наведеному вище прикладі просто написання print([...]), додавання несистемного роздуму рівносильно просто запису більше "випадкових" чисел у цей жорстко кодований список.

"знайти найкоротшу детерміновану програму, яка виводить ту саму послідовність байтів" - у цьому вся суть мого аргументу, оклику. Ви не можете повторити це зображення. Він унікальний щоразу. Шаблон є результатом взаємодії Java, JVM, ОС, кешу процесора +, жорсткого диска, музики Trance, яку я транслював, що споживає цикли процесора / оперативної пам’яті та все між ними. Шаблон просто виникає з одного рядка коду Java всередині циклу for / next. Значна частина ентропії походить від базових апаратних схем. Його не можна кодувати.
Пол Ушак

@PaulUszak Kolmogorov складність вимірює "випадковість" певного значення, як перше зображення, яке ви опублікували; або друге зображення, яке ви опублікували; або знімок цієї HTML-сторінки; тощо. Якщо ви дбаєте про процес, який створив зображення (детермінований чи ні), інші заходи, такі як інформація про Шеннона, були б більш підходящими; Я щойно бачив, що жодна інша відповідь не згадує про складність Колмогорова. Вони обидва корисні методи, оскільки вони розповідають нам різні речі.
Варбо

@PaulUszak Розгляньте тест, який ви зробили, стиснувши ці зображення у форматі PNG-файлів та порівнявши розмір файлу. Розпаковуючи PNG, ви отримуєте назад саме те саме зображення, з яким ви почали; це детерміновано; ви не отримуєте іншого, випадкового зображення. Це робить ваш тест на стиснення марним? Зовсім ні! Складність Колмогорова - це як екстремальна версія вашого тесту PNG: замість того, щоб стискати файл PNG, ми стискаємо до (детермінованої) комп'ютерної програми. Їх можна отримати по- справжньому невеликими, все ще в змозі відтворити всі вихідні дані.
Варбо

6
@PaulUszak Виходячи з вашого коментаря, здається, ви вже усвідомлюєте все необхідне для доведення цитати: ви не використовували детерміновані засоби для створення шаблону, оскільки ви покладаєтесь на ентропію, яку ви чи навколишній світ (мережеве обладнання та сервери) з якого ви потоково передаєте, вміст потоку тощо) внесений у вашу систему. Перевірка останніх восьми біт вимірювань часу в наносекундах, знятих у циклі, - це хороший спосіб отримати урожай, що ентропія - це окреме питання, на яке багато запитань відповідей, але це окрема тема.
mtraceur

7

Стиснення не є точним тестом на випадковість, і не дивиться на зображення і каже "що виглядає випадково".

Випадковість перевіряється емпіричними методами . Насправді є набори спеціально розробленого програмного забезпечення / алгоритмів для тестування випадковості, наприклад, TestU01 та тести Diehard .

Крім того, ваше зображення є насправді 1D рядком числа, відображеним на пробіл, і тому не є гарним поданням певних шаблонів, які можуть з’являтися.

Якби ви вивчали зображення пікселя за пікселем, ви, швидше за все, знайдете безліч коротких моделей збільшення вартості перед раптовим падінням. Якби ви створили графік із значенням x, яке є номером вибірки, а значення y - значенням, отриманим від функції "випадкова", ви, швидше за все, виявите, що ваші дані насправді схожі на пилову хвилю:

Пиляна хвиля

Це схема, отримана значеннями, що збільшуються за модульною арифметикою (що є вашим обчисленням: приклад: збільшення часу з майже постійною швидкістю, і & 0xFFдія mod 256).


Здається, у вас неправильний набір тестів. Усі ваші тести - це тести проходження / відмови на випадковість. Вони не вимірюють ентропію, яка є сутністю цього питання. Стиснення - цілком допустимий показник ентропії для даних, що не належать до IID (див. Заходи ентропії NIST). Це насправді одна з небагатьох, яку можна розумно реалізувати без кандидатів наук із програмування та математики. Хоча ти маєш рацію щодо зуба пилки. Це так, але зуби не є детерміновано випадковими, не регулярними, як ви показали. Звідси ентропія.
Пол Ушак

2
@PaulUszak Чи має сенс цей показник, якщо він залежить від алгоритму стиснення?
куцкем

@kutschkem WEL це один із стандартних заходів ентропії в NIST SP 800-90B. Це також легко зробити. Як ще можна виміряти ентропію, що не стосується IID? А альготи стиску є асимптотичними до нижньої межі, отже, поділ на 2. Формула Шеннона тут не працює.
Пол Узак

3
@PaulUszak - для криптографічних цілей слід вважати, що метод генерації відомий зловмисником. Знання методу, за допомогою якого були створені ці дані, майже напевно дозволяє написати алгоритм стиснення для нього, який робить краще, ніж PNG або будь-який підхід, який робить тест NIST, обидва з яких не передбачають нічого (або, у випадку PNG, нічого, що насправді є правильним) про джерело даних.
Жуль

5

Ви плутаєте поняття випадкових чисел із "числами, які здаються випадковими".

Щоб зрозуміти цитату фон Неймана, ми повинні зрозуміти, що означає "генерувати випадкові числа". Відповідь Warbo пов'язує відмінну XKCD з цією метою: XKCD комічний

Коли ми говоримо про випадкові числа, ми не говоримо про самі значення. Очевидно, що 4 не є більш випадковим, ніж 3. Ми говоримо про можливість здатності третьої сторони передбачати це значення краще, ніж випадковий шанс. Випадкове число - це те, що не передбачувано. Іноді ми додамо до цього умови. Криптографічно захищений генератор псевдовипадкових чисел (CSPRNG) генерує числа, які не можна передбачити краще, ніж випадковий випадок, якщо зловмисник не знає початкового / ключового, але якщо ми говоримо про справді випадкові числа (не псевдовипадкові), зазвичай його визначають як число, яке не передбачувано, навіть при повному знанні системи, включаючи будь-які клавіші.

Тепер ваш приклад, як багато хто зазначав, не є детермінованим. Програма не визначає, з якого значення виходить значення System.nanoTime(). Таким чином, це не в тому ж класі, як використання CSPRNG для генерування псевдовипадкових чисел. Перший може бути недетермінованим, тоді як другий детермінованим, якщо значення ключа є детермінованим. Перша містить операції, для яких не визначено детерміновані значення.

Однак ви зауважите, що я сказав, що це може бути недетермінованим. Майте на увазі, що System.nanoTime()він не призначений для надання значень для цієї мети. Це може бути або бути недостатньо недетермінованим. Додаток може налаштувати системний годинник таким чином, щоб System.nanoTime()всі дзвінки відбувались кратними 256 наносекундами (або закритими). Або ви можете працювати в Javascript, де останні експлуатації Spectre привели головних браузерів до навмисного зменшення роздільної здатності таймерів. У цих випадках ваші "випадкові числа" можуть стати дуже передбачуваними в середовищах, які ви не планували.

  • Таким чином, генерування випадкових чисел з детермінованими процесами ... гріх.
  • Генерація випадкових чисел з виділеним випадковим обладнанням ... не гріх.
  • Генерація випадкових чисел з недетермінованими аспектами комп'ютерів ... можливо, гріх.

Все залежить від того, що ви маєте намір. Якщо ви шифруєте свої любовні листи до Губки Боба, щоб ваша сестра не змогла їх прочитати, вимоги до ваших так званих випадкових чисел досить низькі. System.nanoTime()використаний, як ви робили, мабуть, досить хороший. Якщо ви захищаєте ядерні таємниці проти передової іноземної держави, яка активно їх шукає, вам, можливо, захочеться скористатися обладнанням, розробленим для вирішення проблеми.


4

Я не думаю, що ви зрозуміли претензію. Справа в тому, що якщо існує детермінована процедура для генерації «випадкових» рядів чисел (або що-небудь, насправді), то знайти шаблон - це лише завдання знайти цю процедуру!

Отже, завжди існує детермінований метод для прогнозування наступного цілого числа. Це саме те, що ми не очікуємо, що це станеться, якщо припустити випадковість!

Будь-яка достатньо складна детермінованість не відрізняється від стохастичності.

--From сторінка користувача Wrzlprmft в

Отже, навіть якщо щось виглядає випадковим, чому б на землі ми б моделювали це як "випадкове", якщо ми маємо детерміновану процедуру його генерування?

Це, я думаю, є ключовою проблемою. Ви показали лише певну форму нерозрізненості PRNG та "справжню випадковість".

Однак про те, що ці поняття однакові, не випливає. Зокрема, випадковість - це математичне, теоретичне поняття. Ми вже показали вище, що теоретично розгляд PRNG як "справжньої випадковості" призводить до суперечності. Отже, вони не можуть бути рівними.


1
Помилка, ти впевнений, що ти зрозумів цю цитату? Ви, здається, самі суперечите цьому ..?
Пол Узак

Я? Ви можете уточнити? Я мав намір сказати, що якщо ви хочете ставитися до чогось як до випадкового, генерувати це детерміновано безглуздо, навіть якщо хтось інший не може бачити різниці.
Дискретна ящірка

2
@PaulUszak Ви стверджуєте, що оскільки щось для вас виглядає стохастично, це випадково. Але насправді те, що щось виглядає стохастично, не означає, що це випадково - це також може бути досить складним детермінованим процесом.
Жиль "ТАК - перестань бути злим"

O(n2)

3

Я думаю, що інші вже вказували на це, але це не наголошує, тому дозвольте мені також додати до дискусії.

Як вже вказували інші, існує проблема вимірювання ентропії. Алгоритми стиснення можуть вам щось сказати, але вони є джерельними. Оскільки ви знаєте більше про те, як генерувались дані, ви, ймовірно, могли скласти набагато кращий алгоритм його стиснення, а це означає, що справжня ентропія значно нижча.

Крім того, ви дещо помиляєтесь значеннями фраз "на комп'ютері" та "детерміновано". Ви, звичайно, можете виконувати недетерміновані операції на комп’ютері.

Крім того, ви насправді це просто зробили , але це не так очевидно на перший погляд.

Типовим детермінованим алгоритмом для генерації випадкових чисел є, тобто. PRNG як лінійний конгрурентний генератор. Вони значущі. Внутрішній стан означає меншу ентропію, оскільки наступний стан визначається попереднім. Я не буду заглиблюватися в це, це, мабуть, вам очевидно. Важливим моментом є те, що повністю детермінований алгоритм залежить лише від попереднього стану, яким би він не був.

Тепер подивіться на ваш алгоритм. На чому ґрунтується? Скільки у вас штату? Це детерміновано?

  file.writeByte((byte) (System.nanoTime() & 0xff));

Давайте ігноруємо file.writeі будь-які проблеми змивних буферів, чекаючи вводу-виводу (ти на хвилину намагався додати сильний шум на кабелях жорсткого диска? Ні? Ей, ти міг би це зробити. Ей, тоді це недетерміновано! :)), і Давайте зосередимось на джерелі, це важливіше.

Час є свого роду стан. Вона змінюється, але більшість - однакова. Ось чому ви спробували його обійти і взяли & 0xFF, щоб скинути більшу частину держави. Але ви все це не кинули, деякий стан попереднього читання може просочитися до наступного, тому це, звичайно, не повністю недетермінований *)

Але нас це не цікавить. Щоб "довести", що цитата неправильна:

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

Це потрібно довести детермінованим способом.
Що нас цікавить, це: чи ваш алго, безумовно, повністю детермінований ?

..і очевидно, що це не так.

  System.nanoTime() & 0xff

Це вимірювання часу. Час та вимірювання . Частина вимірювання може зробити її детермінованою, якщо значення кешоване. Я припускаю, що це не так, інакше ця функція не мала б сенсу. Тоді, якщо воно читається на льоту з джерела, ми маємо значення, засноване на часі. Оскільки ( я знову припускаю ) ви цього не виконували на спеціальному апаратному забезпеченні для одного завдання, то, можливо, іноді виникає контекстна комутація. Навіть якщо у вас було обладнання, призначене для одного завдання, вимірювання часу все ще може бути не детермінованим через зміни температури / вологості в джерелі часу, часу роботи шини тощо.

Я повністю погоджуюся, що тут перебільшую. Дрифти не будуть такими великими, щоб зробити великий вплив (хоча реально nanotimeвони можуть бути). Що ще важливіше, nanotimeмається на увазі бути швидким. Він не читається з джерела реального часу. Він заснований на внутрішній кількості процесора / кількості циклів. Це насправді детерміновано, якщо ви не переключаєтесь на зміну контексту.

Моя думка, може бути дуже важко запустити по-справжньому 100% детермінований алгоритм, якщо ви базуєте його вчасно, і ви не маєте права спростувати цю цитату, якщо ви не маєте повністю детермінованих засобів.

*) Цікаво, що ви, мабуть, могли б збільшити фактичну випадковість, якщо підете по жорсткому шляху. Виконайте & 0x01, потроху та зачекайте нитку, перш ніж читати кожен біт. Генерування даних таким чином було б смішно довгим, але я фактично стверджую, що це можна вважати майже справді випадковим, IIF, який ви працюєте на не-RTOS, а також IFF у кожен "помітний час" є достатньо високим, щоб гарантувати, що базові ОС або перейшла у режим сну, або переключилася на інше завдання.


2
NAS

Щось таке було саме за моєю точкою "[ти] можеш побудувати набагато кращий [алгоритм стиснення]"
quetzalcoatl

Не зациклюйтесь на точному 5,3-му значенні. Незалежно від того, наскільки краще ви можете зробити альго-компресію (ви не можете, як я використовував одну з найкращих у світі - paq8px), те, що залишається нестислимим, є чистою ентропією. Це одне з принципових визначень випадковості. Або ви припускаєте, що що-небудь можна стиснути до нуля байтів? Любителі голубів не погоджуються.
Пол Узак

0xff є, тому що ви не можете зробити хороший вибір, використовуючи 64 бітні цілі числа. І якщо ви використовуєте 0x01, вам доведеться возитися з обробкою бітів, що я не міг заважати. Це все. Ентропія NIST і мої власні заходи пропонують ентропію більш високими бітами в будь-якому випадку (~ 5 з них).
Пол Узак

1
+1, і це мені здається найкращою відповіддю на даний момент: Єдине джерело ентропії в ситуації, про яку йдеться, - це саме невідповідності в тому, скільки часу проходить між кожним зчитуванням годинника ! І це походить від сукупності деталей, таких як, як працює планувальник операційної системи, і як працює апаратне забезпечення, і деталі, як, що користувач зробив до цієї системи до цього моменту, що, в свою чергу, побічно впливає на такі речі, як ще потрібне планування або довгий диск доступ зайнятий через фрагментацію з часом або те, що було в swap / пам'яті / кеші або в тому, що мережа / тощо дія тривала.
mtraceur

2

Я думаю, що потрібна відповідь починається з цього коментаря, який ви самі зробили у відповідь ще на одну відповідь:

Шаблон є результатом взаємодії Java, JVM, ОС, кешу процесора +, жорсткого диска, музики Trance, яку я транслював, що споживає цикли процесора / оперативної пам’яті та все, що знаходиться між ними. Шаблон просто виникає з одного рядка коду Java всередині циклу for / next. Значна частина ентропії походить від базових апаратних схем.

Ви вже розумієте це, я думаю: ви не використовували детерміновані засоби для створення шаблону.

Ви використовували комп’ютер, незначна частина якого є детермінованою, але ентропія походить від зовнішніх недетермінованих (або, принаймні, недетермінованих для всіх практичних намірів та цілей на даний момент) джерел: ви чи зовнішній світ взаємодієте з комп’ютером (і меншою мірою - будь-які фізичні недосконалості в апаратному забезпеченні комп'ютера, які можуть вплинути на терміни речей).

Це, до речі, велика частина того, як сучасні операційні системи закладають генератори випадкових чисел, доступних для програм: шляхом використання ентропії у взаємодії зі своїм обладнанням та користувачем, який, як ми сподіваємось, не передбачуваний для зловмисника.

До речі, ентропія зовнішнього світу насправді є проблемою, яку доводиться вирішувати донині в інакше добре кодованій криптографії: комп'ютерах, які мають передбачувану поведінкупід час завантаження та під час їх виконання, наприклад, такі, що зберігаються лише для читання або завантажуються з мережі, і які мають передбачуване мережеве середовище (або не приєднані до мережі, або навантаження в мережі є достатньо низькою, щоб все було доставлено в межах надійний проміжок часу), який запускає той самий обмежений набір програмного забезпечення з приблизно послідовною поведінкою, може значно переоцінити ентропію, яку вони отримують від цих припущених непередбачуваних компонентів, і в кінцевому підсумку генерує набагато більш передбачувані числа ніж ви потрапляєте на типову робочу станцію, яка виконує для вас всілякі інші речі (потокова музика, синхронізація з дроп-бокс і т. д.) на задньому плані.

Я думаю, що більшість відповідей зосереджуються на тому, чи перевірка останніх восьми біт вимірювань часу в наносекундах, знятих у циклі, є хорошим способом збирати цю ентропію. Це дуже важливе питання, щоб правильно відповісти, перш ніж використовувати метод у своєму прикладі як схему генерації випадкових чисел на практиці , але це окреме питання від того, що я думаю, що ви задаєте.


0

Щоб додати до попередніх відповідей, ось простий спосіб подумати над цим питанням.

Вся справа в різниці між випадковим і детермінованим . Ми приїдемо до Фон Ноймана і що він говорив після цього.

Випадкові числа

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

Це ідеальний випадок - в практичному плані ми потрапляємо туди, поєднуючи безліч джерел, які "не є поганими наближеннями" до випадкових, або справді випадковими, або які математично змішують речі достатньо, щоб ви могли математично довести, що вони наближаються до неперевіреного і відсутність упередженості до будь-яких конкретних цифр або моделей.

  • "Гарні" джерела - це речі, схожі на очікування процесу радіоактивного розпаду або іншого квантового процесу, який по суті непередбачуваний. Вихід з напівпровідника, чутливого до тепла. Випадковий шум у діоді чи іншому електричному матеріалі. Підрахунок фотонів від сонця.

  • Змішавши це, ми також можемо додати деякі, які ми вважаємо «непоганими», які допомагають, оскільки вони не мають жодного зв’язку з цим: чекаємо наступного клацання мишкою або мережевого пакету. Останній біт мікрочасу при наступному записі файлу. Виведення функції "відомої, але математично досить випадкової" генератора псевдовипадкових чисел. Попередня ентропія від попереднього використання випадкових чисел.

Метою тут є отримати число, яке досі неможливо передбачити , що б у Всесвіті ви не знали , і є статистично такою ймовірною, як це, без математично виявленого шаблону, упередженості чи передбачуваності та ніякої кореляції з подією, яка можна було б відслідковувати та використовувати для прогнозування. (Або, якщо це співвідноситься з подією, то це робиться таким чином, що робить з'єднання неймовірно розрядним, наприклад, "наносекундна цифра лише часу останнього натискання миші")

Детерміновані числа

Математики можуть довести речі щодо формул та функцій. Таким чином, можна довести, що функція, коли її повторно викликають, не надає жодної упередженості або переваги перед будь-яким шаблоном, крім простого шаблону: "це виходи цієї функції, якщо повторно викликаються".

Так, наприклад, якщо ви вибрали число, скажімо, від 1 до 10 мільйонів, записуєте його в двійковій формі і "хеш" це повторно, ви отримаєте досить випадкову послідовність цифр. Це майже випадково - але насправді це зовсім не випадково. Ви можете передбачити заданий алгоритм та будь-який стан, яким буде наступне число.

Ми називаємо це "псевдовипадковою", тому що вона виглядає і, здається, переважно випадковою, навіть якщо це не так.

Ось хороший приклад. Подумайте про цю послідовність 3-х значних "випадкових чисел": 983, 367, 336, 244, 065, 664, 308, 602, 139, 494, 639, 522, 473, 719, 070, 217. Скажімо, що я вам кажу Я можу генерувати мільйон чисел так само. Потім ви можете передати статистику, який підтвердить (скаже), що вони розподіляються порівну або що б там не було. Немає очевидних передбачуваних шаблонів. Вони виглядають досить випадково, правда? Але зараз я вам кажу, що вони є насправді

500-та + цифра Пі, згрупована в 3s.

Раптом, як би випадково це не було

цифр Пі

можливо, ви можете відразу передбачити, що наступні 2 числа будуть 986 і 094.

Щоб було зрозуміло, я не знаю точно, наскільки випадкові

цифр Пі

є. Це буде вивчено і відповідь добре відома. Але справа в цьому: В принципі, однаковий висновок справедливий для будь-якого джерела, яке виробляється в результаті детермінованого процесу .

Між

Між ними, є цілий ряд "речей, які виглядають випадковими і часто є випадковими до певної міри". Чим більше випадковостей і близьких випадковостей можна змішати, тим меншою є схильність виходу до можливості виявлення будь-якої картини або математичного прогнозування будь-якого результату.

Назад до фон Неймана і ваше запитання

Як бачимо, детерміновані результати можуть виглядати випадковими, але навіть статистично можуть бути розподілені випадковим чином. Вони можуть навіть використовувати "секретні" або швидкозмінні дані, про які ми не можемо знати. Але поки це детерміновано, числа все ще ніколи не можуть бути справді випадковими . Вони можуть бути лише "досить близькими до випадкових випадків, що ми раді забути різницю".

Ось сенс цитати, яку ви дали. Детермінований процес просто не може дати випадкові числа. Він може давати лише числа, які, здається, і поводяться зовсім як випадкові числа.

Тепер ми можемо переформулювати ваше запитання так: "Вихід мого (або будь-якого сучасного) комп'ютера може виглядати та вести себе абсолютно випадковим чином. Це означає, що цитата фон Неймана зараз застаріла і неправильна?"

Проблема все ще така: Навіть якщо вихідний сигнал вашого комп'ютера може виглядати та вести себе випадковим чином, він все ще може не бути справді випадковим . Якщо він розрахований лише детерміновано, це означає, що немає нічого, що не було б передбачуваним причинно-наслідковим ефектом щодо gettinbg наступного числа (ось що означає "детермінований" у цьому сенсі). Ми починаємо з деяких існуючих даних (відомих), застосовуємо відомий процес (складний чи брудний чи будь-який інший), і отримуємо те, що здається новим «випадковим числом». Але це не випадково, бо процес був детермінованим.

Якщо ви скажете, що ваш метод буде включати справжній апаратний генератор випадкових випадків, щоб виправити це (як-от випадкове число, що генерується від радіоактивного розпаду або шуму в напівпровіднику), то ваша відповідь тепер може бути випадковою - але ваш метод за визначенням вже не детермінований , саме тому , що ви не можете передбачити виходи (або ефекти) з огляду на входи / вихідні дані (причини) більше .

Фон Нойман виграє в обох напрямках, майже за визначенням!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.