Розуміння "випадковості"


829

Я не можу обійтись цим, що є більш випадковим?

rand()

АБО :

rand() * rand()

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


Редагувати:

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


162
Що ви маєте на увазі під "більш випадковим"?
dan04

55
Як заявили інші, ці дві величини не мають однакового розподілу. Дивіться mathworld.wolfram.com/UniformProductDistribution.html про розповсюдження, яке ви фактично отримуєте. Порівняйте це з єдиним рівномірним випадковим числом, де всі значення в інтервалі однаково вірогідні, тому функція щільності ймовірності є горизонтальною прямою.
бнаул

44
Я настійно рекомендую читати випадкову дурість на щоденному WTF . Особливо читайте цей коментар , де вони аналізують вихід цього нового випадкового числа. Повідомлення, що потрібно відмовитися від цього, полягає в тому, що: довільні операції над випадковими числами не обов'язково призводять до випадкового виведення .
детле

51
Також: Інтуїтивно я знаю, що математична відповідь полягатиме в тому, що вони однаково випадкові - якби ви могли займатися математикою за допомогою інтуїції поодинці, нам не знадобляться всі ці криваві символи: P
декрет

92
Не приймайте статистику та інтуїцію однієї партії ....
Доктор Белісарій,

Відповіді:


1481

Просто уточнення

Хоча попередні відповіді правильні, коли ви намагаєтесь виявити випадковість псевдовипадкової змінної або її множення, ви повинні знати, що, хоча Random () зазвичай рівномірно розподілений, Random () * Random () - ні.

Приклад

Це рівномірний вибірковий вибірковий розподіл, модельований за допомогою псевдовипадкової змінної:

Гістограма випадкових ()

        BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

Хоча це розподіл, який ви отримуєте після множення двох випадкових змінних:

Гістограма випадкових () * Випадкових ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Так, обидва є "випадковими", але їх розподіл дуже різний.

Ще один приклад

Хоча 2 * Random () розподілено рівномірно:

Гістограма 2 * Random ()

        BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

Випадково () + Випадково () немає!

Гістограма випадкових () + випадкових ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Центральна гранична теорема

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

Всього за чотири терміни ви отримуєте:

Гістограма випадкових () + випадкових () + випадкових () + випадкових ()

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]  

І тут ви можете побачити шлях від рівномірного до нормального розподілу, додавши 1, 2, 4, 6, 10 і 20 рівномірно розподілених випадкових змінних:

Додана гістограма різної кількості випадкових величин

Редагувати

Кілька кредитів

Дякую Томасу Ейлу за те, що в коментарях зазначив, що розподіли ймовірностей, показані на двох останніх зображеннях, відомі як розподіл Ірвіна-Холла

Дякую Ейке за її чудову функцію []


41
+1. Оскільки ОП, ймовірно, хотів рівномірного розподілу, це має бути прийнятою відповіддю. І якби ви це зробили rand()+rand(), ви отримали б розподіл типу 2d6 з жировим центром.
Тіло

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

46
@Trufa: Можливо, це допоможе з частиною інтуїції, принаймні для сум. Уявіть собі, як взяти "середню" одну прокату. А тепер уявіть собі, як взяти в середньому дві кубики. Зараз сто. Що трапляється з шансом отримати середню один чи шість, коли ви додасте більше кісток?
johncip

3
@matt b Діаграми є однолінійними в Mathematica. Код - це текст жирним шрифтом, який передує кожному графіку. Mathematica - дивовижна мова для ведення сюжетів!
Доктор Белісарій,

4
@thenonhacker: так, гістограми демонструють упередженість, але вони не демонструють невипадковості. Об'єднані випадкові числа не менш випадкові. Що стосується правильної відповіді на початкове запитання користувача, «не намагайся бути розумним, ти просто погіршиш», і ця відповідь напевно відповідає цьому.
Кеннет Беленький

151

Я думаю, що обидва методи є випадковими, хоча мій gutfeel сказав, що rand() * rand()це менш випадково, оскільки він дасть більше нулів. Як тільки один rand()є 0, загальний стає0


18
Моя відповідь на всі відповіді, використовуючи цю смужку, така: мені подобається гумор, але він повинен бути CW!
Андреас Рейбранд

4
@Andomar: Ні, це не так. Зовсім ні. Чи знаєте ви, що таке CW?
Андреас Рейбранд

17
@Andreas Rejbrand: CW - це зброя, яка вбиває цікаві питання, заперечуючи репутацію тим, хто на це відповідає. Схоже, що це загрожує мета.stackexchange.com/ questions/ 392/… (можливо, чому це цікаве питання спливає!)
Андомар,

11
@Andomar - Так, CW вбиває цікаві запитання, але (з FAQ ) "Репутація - це груба оцінка того, наскільки громада вам довіряє". Якщо ви додасте у відповідь смішне, захищене авторським правом зображення, це змусить мене вважати, що ваша відповідь крута, і я, мабуть, думаю, що ви також круті, але це не робить вас більш довірливими - отже, в ідеалі, немає представника слід нагородити. Чи це означає CW, чи це означає, що не слід голосувати, відповідь - це інше питання.
Річард JP Le Guen

13
тролль "випадкового генератора" у мультфільмі може бути просто дивним декламацією π та просто досягненням точки Фейнмана . btw, чи є π цифри випадковими? :)
mykhal

82

Ні "більше випадково".

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

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

Деякі додаткові пояснення. Далі «непередбачуваний» і «випадковий» посилаються на здатність когось здогадатися, яке наступне число буде засноване на попередніх числах, тобто. оракул.

Дано насіння, xяке формує наступний список значень:

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand()генерує вищезазначений список та rand() * rand()генерує:

0.18, 0.08, 0.08, 0.21, ...

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


9
+1 Зауважте, що з іншого боку rand()+rand()+rand()...стає все менше "менш випадковим" (якщо випадково ви маєте на увазі рівномірно розподілені).
Тіло

4
@Thilo Ні, це не ...? Якщо випадкова величина рівномірно розподілена в діапазоні (0,1), і ви відбираєте змінну n разів і приймаєте суму, вона буде просто рівномірно розподілена в діапазоні (0, n).
користувач359996

5
@Trufa просто довіряють, rand()що насправді є випадковим, і не намагайтеся "посилити" це випадковістю. Не встановлюйте насіння кілька разів. Будь-яке окреме насіння є прекрасним, доки воно само по собі є випадковим. Багато реалізацій, які я бачив, використовують епоху UNIX як насіння, яке змінюється щосекунди і є унікальним кожного разу, коли воно змінюється.
Меттью Шарлі

61
@ user359996 rand () + rand () розподілено не рівномірно. Додайте дві кістки, вам більше шансів отримати 7, ніж 2.
Ліам

4
@thenonhacker Дивіться моє визначення випадковості в моєму дописі. Тільки тому, що значення мають тенденцію до одного кінця спектру, не збільшується передбачуваність точних отриманих значень, про що я мав на увазі, коли використовував слово випадковий. Тоді я продовжував окремо вирішувати питання упередженості.
Меттью Шарлі

80

Попрощення для ілюстрації точки.

Припустимо, що ваша випадкова функція лише виводить 0або 1.

random()є одним із (0,1), але random()*random()є одним із(0,0,0,1)

Ви чітко бачите, що шанси отримати 0в другому випадку жодним чином не рівні шансам отримати балончик 1.


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

Що є більш випадковим?

Будучи , що random(), random()*random(), random()+random(), (random()+1)/2або будь-яка інша комбінація , яка не приводить до фіксованого результату мають один і той же джерело ентропії (або ж початковий стан в разі псевдовипадкових генераторів), то відповідь буде те , що вони в рівній мірі випадковим чином (різниця є в їх поширенні). Ідеальний приклад, на який ми можемо подивитися, - гра в Craps. Ви отримаєте число, random(1,6)+random(1,6)і всі ми знаємо, що отримати 7 має найбільший шанс, але це не означає, що результат прокатки двох кісток є більш-менш випадковим, ніж результат прокатки.


+1 за конденсацію чогось диявольсько хитрого типу "однаково випадковий за різних розподілів". Дуже елегантний.
Єнс Роланд

3
Отже, технічно (random () * 0 + 9) однаково випадковий, оскільки він випадковим чином повертає значення з набору 1-елементів: [9]. Мультфільм Ділберта мав рацію.
Єнс Роланд

2
@Jens Rolan "будь-яка інша комбінація, яка не призводить до фіксованого результату";). 999999 <i>, ймовірно, </i> не генерується випадковим чином, і можливість обчислення випадкових випадків може бути обчислена.
Алін Пуркару

69

Ось проста відповідь. Розглянемо монополію. Ви розкачаєте дві шестисторонні кістки (або 2d6 для тих, хто віддає перевагу ігровим нотаціям) і приймаєте їх суму. Найпоширеніший результат - 7, оскільки існує 6 можливих способів скотити 7 (1,6 2,5 3,4 4,3 5,2 та 6,1). Тоді як 2 можна прокрутити лише на 1,1. Неважко помітити, що прокат 2d6 відрізняється від прокатки 1d12, навіть якщо діапазон однаковий (ігноруючи, що ви можете отримати 1 на 1d12, точка залишається такою ж). Помноження результатів замість їх додавання викривить їх подібним чином, при цьому більшість результатів відображатиметься в середині діапазону. Якщо ви намагаєтесь зменшити кількість людей, що втрачають люди, це хороший метод, але це не допоможе зробити рівномірний розподіл.

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


4
"Помноження результатів замість додавання їх буде викривленим подібним чином, при цьому більшість результатів відображається в середині діапазону." - перевірити це твердження проти другого графа у відповіді від Велізарія.
Даніель Ервікер

52

Обов'язковий xkcd ...
повернення 4;  // обраний справедливим рулоном кісток, гарантовано випадковим.


7
Данм, це завжди виявляється, коли з'являється слово "випадковий" :) Я чекав цього !!
Труфа

9
Мені подобається гумор, але він повинен бути CW.
Андреас Рейбранд

2
@Andreas Rejbrand - чому відповідь на цей "гумор" має бути CW?
warren

16
Якщо це не CW, репутація буде одержана плакатом відповіді кожного разу, коли вона буде озвучена (160 реп. Поки що). Тепер репутація схожа на оцінки в школі - це має бути сертифікат технічної (в даному випадку програмування) кваліфікації. Тому не можна здобути собі репутацію, розміщуючи щось, що легко забирається, але це не потребує такої професійності. Крім того, оцінка репутації також визначає привілеї користувача. Наприклад, при 10 000 балах користувач отримує доступ до засобів модерації на StackOverflow.
Андреас Рейбранд

35

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

     1    2    3    4    5    6
  -----------------------------
1|   1    2    3    4    5    6
2|   2    4    6    8   10   12
3|   3    6    9   12   15   18
4|   4    8   12   16   20   24   
5|   5   10   15   20   25   30
6|   6   12   18   24   30   36

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

Ті ж принципи, які описують несправедливий розподіл між костями, однаково застосовуються і до чисел з плаваючою комою між 0,0 та 1,0.


3
+1 для конкретнішого відображення зміни розподілу при множенні випадкових чисел. Матриця допомогла більше, ніж просто слова або навіть графік розподілу.
Мар'ян Венема

26

Деякі речі про "випадковість" є протиінтуїтивними.

Якщо припустити плоский розподіл rand(), ви отримаєте нижче не плоскі розподіли:

  • високий ухил: sqrt(rand(range^2))
  • зміщення, що досягає максимуму в середині: (rand(range) + rand(range))/2
  • низький: зміщення: range - sqrt(rand(range^2))

Існує маса інших способів створення конкретних кривих зміщення. Я зробив швидкий тест, rand() * rand()і ви отримаєте дуже нелінійний розподіл.


24

Більшість реалізацій rand () мають певний період. Тобто після деякої величезної кількості дзвінків послідовність повторюється. Послідовність виходів rand() * rand()повторів у половині часу, тому в цьому сенсі вона "менш випадкова".

Крім того, без ретельної побудови виконання арифметики на випадкових значеннях, як правило, викликає менше випадковості. Повертається плакат, що цитується " rand()+ rand()+ rand()..." (k раз, скажімо), який насправді буде до k разів перевищує середнє значення діапазону значень rand(). (Це випадкова хода з кроками, симетричними щодо цього значення.)

Припустимо для конкретності, що функція rand () повертає рівномірно розподілене випадкове дійсне число в діапазоні [0,1). (Так, цей приклад дозволяє безмежну точність. Це не змінить результату.) Ви не вибрали конкретну мову, і різні мови можуть робити різні речі, але наступний аналіз проводиться з модифікаціями для будь-якої невірної реалізації rand ( ). Продуктrand() * rand() також знаходиться в асортименті [0,1), але більше не рівномірно розподілений. Насправді виріб може бути в інтервалі [0,1 / 4), як і в інтервалі [1 / 4,1). Більше множення приведе результат ще більше до нуля. Це робить результат більш передбачуваним. У широких штрихах, більш передбачуваних == менш випадкових.

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


У мене теж була така думка, що він пройде через випадковий генераторний період вдвічі швидше.
Jared Updike

3
Довжина послідовності буде розрізана навпіл, лише якщо вона є рівною. Якщо це дивно, ви отримуєте r1 * r2, r3 * r4, ..., rn * r1, r2 * r3, r4 * r5, а загальна довжина однакова.
Джендер

23

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

У цьому випадку randце PRNG, тому не зовсім випадковий. (насправді, досить передбачувано, якщо насіння відоме). Помноження його на інше значення робить його не більш-менш випадковим.

Справжній RNG-криптовалюта насправді буде випадковим. І запущені значення через будь-яку функцію не можуть додати більше ентропії до неї, і, швидше за все, можуть видалити ентропію, що робить її більше не випадковою.


3
Зауважте, це не квартовано, оскільки кожен виклик із поверненням відрізняється значенням. Все інше точно.
Меттью Шарлі

2
@thenonhacker: За власним описом послідовність "1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10 , 1,2,3,4,5,6,7,8,9,10 ... "є випадковим. Він розподілений рівномірно, при цьому всі числа отримують неабиякі шанси. Немає піку чи зміщення. Ви дійсно вважаєте цю послідовність випадковою ??? Вам потрібно змінити своє визначення. Випадкове не про вихід, випадкове - про процес, який використовується для створення результату.
абеленький

2
@CurtainDog: Стиснення тексту підтримує однаковий рівень ентропії, зменшуючи кількість бітів, необхідних для вираження тієї ж кількості ентропії.
Кеннет Беленький

4
@thenonhacker, @abelenky: Навіть розповсюдження легко. Що важливо для генератора випадкових чисел - це кількість бітів у стані генератора випадкових чисел. Генератор випадкових чисел з нульовим станом (наприклад, 4, 4, 4, 4, 4, ...) цілком передбачувано. Одноразова панель має стільки ж стану, скільки кількість значень, які вона виробляє, тому неможливо передбачити. Згортання двох PNRG призведе до того, що PNRG матиме стільки бітів ентропії, скільки вони містять, за вирахуванням їх коваріації.
Кеннет Беленький

1
@Kennet - Дякую, ти дуже зрозумів це для мене. @abelenky - круто, я тебе зараз отримую.
CurtainDog

20

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

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

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

Отже, якщо ви хочете , щоб випадкове число з двох випадкових зразків, є «двічі» , як випадкове, ви конкатенації двох бітових рядків разом. Практично, ви просто вкладете зразки у високі та низькі половинки слова подвійної довжини.

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


2
Я ніколи не думав про випадкові покоління чисел через xor, але, мабуть, ви можете зайняти цю концепцію досить далеко ( en.wikipedia.org/wiki/Mersenne_twister )! Дякую за відповідь.
Габріель Мітчелл

1
Я дійсно з усіх сил звертав уваги на цю відповідь ... Не максимальна ентропія переможені відповідей в stackoverflow.com/questions/3956478/understanding-randomness / ... і stackoverflow.com/questions/3956478/understanding-randomness / ... . У цих випадках вибране число не можна стиснути, але вам буде важко натиснути їх випадковим чином.
CurtainDog

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

1
@CurtainDog xkcd випадкове число 4або двійкове 0100може бути стиснене до нуля біт. Програма декомпресії просто поверне «4». Це не стає менш випадковим, ніж це. Проблема з ділбертом полягає в тому, що ми не знаємо, чи можемо ми стиснути його до нульових бітів (декомпресія, завжди повертаючи «дев'ять»). Це може повернути вісім також, тоді ми можемо стиснути до 1 біта. Декомпресія на: 0-> дев'ять, 1-> вісім. У нас був би 1 випадковий біт.
Іштар

14

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

Найпростіший спосіб подумати про теорію інформації - це з точки зору найменшої одиниці інформації, єдиного біта.

У стандартній бібліотеці С rand()повертає ціле число в діапазоні від 0 до RAND_MAX, обмеження, яке може бути визначене по-різному в залежності від платформи. Припустимо , що RAND_MAXтрапляється, визначається як , 2^n - 1де nє деяке ціле число (це трапляється в разі реалізації Microsoft, де nє 15). Тоді ми б сказали, що хороша реалізація поверне nбіти інформації.

Уявіть, що rand()будує випадкові числа, перегортаючи монету, щоб знайти значення одного біта, а потім повторюючи, поки у неї не буде партія 15 біт. Тоді біти незалежні (значення будь-якого одного біта не впливає на ймовірність того, що інші біти в тій же партії мають певне значення). Таким чином, кожен біт, розглянутий незалежно, схожий на випадкове число від 0 до 1 включно, і "рівномірно розподілений" в цьому діапазоні (як імовірно, це 0 як 1).

Незалежність бітів гарантує, що числа, представлені партіями бітів, також будуть рівномірно розподілені за їх діапазоном. Це інтуїтивно очевидно: якщо є 15 біт, дозволений діапазон дорівнює нулю 2^15 - 1= 32767. Кожне число в цьому діапазоні є унікальним малюнком бітів, таким як:

010110101110010

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

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

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

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

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

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

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


3
+1: Насправді між будь-якими двома плавцями подвійної точності IEEE відсутні більше цифр, ніж число у цілих (математичних) цілих числах.
Дональні стипендіати

13

Як говорили інші, легка коротка відповідь така: Ні, це не більш випадково, але це змінює розподіл.

Припустимо, ви грали в гру з кубиками. У вас є цілком чесні, випадкові кістки. Чи були б рулони з матрицею "більш випадковими", якби перед кожним валиком спершу ви поклали дві кубики в миску, розтрусили її, вибрали одну з кісток навмання, а потім згорнули цю? Зрозуміло, це не має ніякого значення. Якщо обидві кубики дають випадкові числа, то випадковий вибір однієї з двох кісток не матиме значення. У будь-якому випадку ви отримаєте випадкове число від 1 до 6 з рівномірним розподілом на достатню кількість рулонів.

Я думаю, що в реальному житті така процедура може бути корисною, якщо ви підозрюєте, що кістки НЕ можуть бути справедливими. Якщо, скажімо, кістки трохи не врівноважені, тому один прагне давати 1 частіше, ніж 1/6 часу, а інший має тенденцію давати 6 незвично часто, то випадковий вибір між двома має тенденцію затьмарювати зміщення. (Хоча в цьому випадку 1 і 6 все-таки з'являться більше 2, 3, 4 і 5. Ну, мабуть, залежно від характеру дисбалансу.)

Існує багато визначень випадковості. Одне визначення випадкового ряду полягає в тому, що це ряд чисел, отриманий випадковим процесом. За цим визначенням, якщо я прокатаю справедливий штамб в 5 разів і отримаю числа 2, 4, 3, 2, 5, це випадковий ряд. Якщо я згортаю той самий ярмарок, помираю ще 5 разів і отримую 1, 1, 1, 1, 1, то це теж випадковий ряд.

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

EDIT

Я не думаю, що я міг би відповісти на проблему Monty Hall в коментар, тому я оновлю свою відповідь.

Для тих, хто не читав посилання Велізарія, суть його полягає в тому, що: Учаснику ігрового шоу надається вибір з 3 дверей. За одним - цінний приз, за ​​іншими - щось нікчемне. Він підбирає двері №1. Перш ніж розкрити, переможець чи програв, господар відкриває двері №3, щоб виявити, що він програв. Потім він дає можливість учаснику перейти до дверей №2. Чи повинен це робити учасник чи ні?

Відповідь, яка ображає інтуїцію багатьох людей, полягає в тому, що він повинен перемикатися. Ймовірність того, що його первісний вибір був переможцем, становить 1/3, що переможець інших дверей - 2/3. Моя первісна інтуїція, поряд з багатьма іншими людьми, полягає в тому, що не було б ніякого виграшу в переключенні, що шанси просто змінилися на 50:50.

Зрештою, припустимо, що хтось увімкнув телевізор відразу після того, як ведучий відкрив програючі двері. Ця людина побачила б дві закриті двері. Припускаючи, що він знає природу гри, він би сказав, що є шанс на 1/2, щоби кожна двері ховала приз. Якими можуть бути шанси для глядача 1/2: 1/2, а шанси для учасника - 1/3: 2/3?

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

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

Тож як нам придумати 1/3 та 2/3? Коли учасник спочатку обрав двері, у нього був 1/3 шанс вибрати переможця. Я думаю, що багато чого очевидно. Це означає, що було 2/3 шансів, що одна з інших дверей переможець. Якщо господар господаря йому зможе переключитися, не даючи додаткової інформації, виграшу не було б. Знову ж, це має бути очевидним. Але один із способів поглянути на це - сказати, що є 2/3 шанси, що він виграє перемиканням. Але у нього є 2 альтернативи. Отже, у кожного лише 2/3, поділене на 2 = 1/3 шансу перемогти, що не краще, ніж його оригінальний вибір. Звичайно, ми вже знали кінцевий результат, це просто обчислює його по-іншому.

Але зараз ведучий виявляє, що один із цих двох виборів не є переможцем. Тож 2/3 шансів, що двері, які він не вибрав, є переможцем, тепер він знає, що 1 з 2 альтернативних варіантів це не так. Іншого може бути, а може і не бути. Таким чином, у нього більше немає 2/3, поділеного на 2. У нього є нуль для відкритих дверей і 2/3 для закритих дверей.


Дуже хороші аналогії! Я думаю, це дуже хороше англійське пояснення, і на відміну від багатьох інших, ви насправді відповіли на моє запитання :)
Trufa

@Trufa @Jay ДУМКА серед можливих попередніх знань про події та випадковості ДУЖЕ поширений. Дозвольте поділитися з вами цією цікавою історією про жінку, яка вирішила проблему і кинула купу сорому на деяких кращих математиків в академії. Вони сказали багато речей, щоб потім пошкодувати (наприклад, "Ви помилилися, але подивіться на позитивну сторону. Якщо всі ці доктора наук помилялися, країна опинилася б у дуже серйозній проблемі"). Тож ось історія, пов’язана з вашими міркуваннями ... насолоджуйтесь! marilynvossavant.com/articles/gameshow.html
д-р belisarius

@belisarius так. Я кажу, що блекджек21 :) просто жартую, я розумію тебе!
Труфа

@belisarius BTW ніколи не отримав цього, я спробую його ще раз спробувати!
Труфа

@Trufa А ось стаття, що показує академічну реакцію на заяву Мерилін query.nytimes.com/gst/… (ДУЖЕ ДУЖЕ)
Доктор Белісарій,

11

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

rand() mod 2

При досить великому розподілі кількість парних чисел повинна дорівнювати кількості непарних чисел.

Тепер розглянемо невеликий твіст:

rand() * rand() mod 2

Якщо один з результатів парний, то весь результат повинен бути рівним. Розглянемо чотири можливі результати (навіть * парний = парний, парний * непарний = парний, непарний * навіть = парний, непарний * непарний = непарний). Тепер, при досить великому розповсюдженні, відповідь має становити навіть 75% часу.

Я б став би на голову, якби ти був.

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


1
Остерігайся! rand()%2може бути не дуже випадковим; це насправді залежить від випадковості низького біта, і деякі PRNG не дуже хороші таким чином. (Звичайно, на деяких мовах ви отримуєте результат з плаваючою комою, rand()тому ви взагалі не можете це зробити…)
стипендіати

10

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

У ситуації з ОП він хоче знати, який результат X * X = X ^ 2, де X - випадкова величина, розподілена по Уніформі [0,1]. Ми будемо використовувати техніку CDF, оскільки це просто зіставлення один на один.

Оскільки X ~ Уніформа [0,1], це cdf є: f X (x) = 1 Ми хочемо перетворення Y <- X ^ 2, таким чином, y = x ^ 2 Знайдіть обернене x (y): sqrt (y) = x це дає нам x як функцію y. Далі знайдіть похідну dx / dy: d / dy (sqrt (y)) = 1 / (2 sqrt (y))

Розподіл Y задається у вигляді: f Y (y) = f X (x (y)) | dx / dy | = 1 / (2 квт (у))

Ми ще не закінчили, ми повинні отримати домен Y. оскільки 0 <= x <1, 0 <= x ^ 2 <1, так що Y знаходиться в діапазоні [0, 1). Якщо ви хочете перевірити, чи справді pdf Y є файлом pdf, інтегруйте його через домен: Інтегруйте 1 / (2 sqrt (y)) від 0 до 1 і дійсно, він з’являється як 1. Також помітьте форму згадана функція схожа на те, що було розміщено на зраді.

Що стосується таких речей, як X 1 + X 2 + ... + X n , (де X i ~ Уніформа [0,1]), ми можемо просто звернутися до теореми центрального граничного значення, яка працює для будь-якого розподілу, моменти якого існують. Ось чому Z-тест існує насправді.

Інші методи визначення результуючого pdf включають перетворення Якобії (що є узагальненою версією технології cdf) та техніку MGF.

EDIT: Як уточнення, зауважте, що я говорю про розподіл отриманого перетворення, а не про його випадковість . Це насправді для окремої дискусії. Також те, що я насправді отримав, було для (rand ()) ^ 2. Для rand () * rand () набагато складніше, що в будь-якому випадку не призведе до рівномірного розподілу будь-яких видів.


9

Це не зовсім очевидно, але, rand()як правило, більш випадкове, ніж rand()*rand(). Важливо те, що це насправді не дуже важливо для більшості застосувань.

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

Ядро, чому rand()є більш випадковим (за припущенням, що він виробляє випадкові числа з плаваючою комою з діапазоном [0..1], що дуже часто), що коли ви множите два макети FP разом з великою кількістю інформації в мантісі, ви отримуєте деяка втрата інформації з кінця; в плавці подвійної точності IEEE просто недостатньо, щоб зберігати всю інформацію, яка була в двох плавках подвійної точності IEEE, рівномірно вибраних випадково з [0..1], і ці зайві біти інформації втрачаються. Звичайно, це не так вже й важливо, оскільки ви (напевно) не збиралися використовувати цю інформацію, але втрата реальна. Це також не має значення, який дистрибутив ви виробляєте (тобто, яку операцію ви використовуєте для комбінації). Кожне з цих випадкових чисел має (у кращому випадку) 52 біти випадкової інформації - це "

Більшість застосувань випадкових чисел не використовують навіть близько стільки випадковості, скільки є насправді у випадковому джерелі. Отримайте хороший PRNG і не переживайте над цим. (Рівень «доброти» залежить від того, що ви робите з цим; ви повинні бути обережними, виконуючи моделювання в Монте-Карло або криптографію, але в іншому випадку ви, ймовірно, можете використовувати стандартний PRNG, як це зазвичай набагато швидше.)


1
Цю відповідь справді потрібно читати спільно з чудовим Велісарієм; вони охоплюють різні аспекти проблеми.
Дональні стипендіати

7

Плаваючі рандоми, в основному, засновані на алгоритмі, який виробляє ціле число між нулем і певним діапазоном. Таким чином, використовуючи rand () * rand (), ви по суті говорите int_rand () * int_rand () / rand_max ^ 2 - значить ви виключаєте будь-яке просте число / rand_max ^ 2.

Це суттєво змінює рандомізований розподіл.

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


@belisarius: Це лише в тому випадку, якщо 1 можливий результат випадкового процесу.
Жоріс Мейс

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

7

Перемноження чисел може закінчитися меншим діапазоном рішення, залежно від архітектури комп'ютера.

Якщо на дисплеї комп'ютера відображається 16 цифр, це rand()було б 0.1234567890123, помножене на секунду rand(), 0.1234567890123, дасть 0.0152415 те, що ви точно знайдете менше рішень, якщо повторите експеримент 10 ^ 14 разів.


3

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

Ми нормалізуємо, щоб вона була позитивною, містилася в межах діапазону і навіть підходила до обмежень розміру пам'яті для призначеного типу змінної.

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

Тепер, коли ви додасте випадкове число до іншого випадкового числа, сума буде десь між 0 і 2X ... це перекосує значення вдалині від крайових точок (ймовірність додавання двох малих чисел разом і двох великих чисел разом дуже мала, коли у вас є два випадкових числа у великому діапазоні).

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

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

Скажімо, наприклад, RandomReal({-x, x}, 50000, .01)тоді ви отримаєте рівномірний розподіл чисел на негативну позитивну сторону, і якщо ви додаєте випадкові числа разом, вони підтримували б їх "випадковість".

Тепер я не впевнений, що станеться з Random() * Random()від'ємним до позитивним інтервалом ... це було б цікавим графіком для перегляду ... але я повинен повернутися до написання коду зараз. :-P


2
  1. Немає такого поняття, як більш випадкове. Це або випадково, або ні. Випадковий означає "важко передбачити". Це не означає недетермінованість. І випадкові (), і випадкові () * випадкові () однаково випадкові, якщо випадкові () випадкові. Що стосується випадковості, то розподіл не має значення. Якщо трапляється нерівномірний розподіл, це просто означає, що деякі значення є більш імовірними, ніж інші; вони все ще непередбачувані.

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

  3. Важливі бажані властивості випадкових чисел: повторюваність та відтворюваність, статистична випадковість, (як правило) рівномірно розподілені, а великий період - декілька.

  4. Щодо перетворень на випадкові числа: Як хтось сказав, сума двох або більше рівномірно розподілених результатів призводить до нормального розподілу. Це додаткова центральна межа теореми. Він застосовується незалежно від розподілу джерела, якщо всі дистрибутиви є незалежними та однаковими. TheмультиплікативнийЦентральна гранична теорема говорить, що добуток двох або більше незалежних і побічно розподілених випадкових величин є ненормальним. Графік, який створив хтось інший, виглядає експоненціально, але він справді ненормальний. Тож випадковий () * random () розподіляється логічно (хоча він може не бути незалежним, оскільки числа витягуються з одного потоку). Це може бути бажано в деяких додатках. Однак зазвичай краще сформувати одне випадкове число і перетворити його на логічно розподілене число. Випадкові () * випадкові () можуть бути важкими для аналізу.

Для отримання додаткової інформації зверніться до моєї книги на веб-сайті www.performorama.org. Книга будується, але відповідний матеріал є. Зауважте, що номери глав та розділів можуть змінюватися з часом. Глава 8 (теорія ймовірностей) - розділи 8.3.1 та 8.3.3, глава 10 (випадкові числа).


1

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


1

Насправді, коли ти думаєш про це rand() * rand(), менш випадково, ніжrand() . Ось чому.

По суті, існує така ж кількість непарних чисел, що і непарні числа. І сказати, що 0,04325 непарно, і як 0,388 парне, а 0,4 парне, а 0,15 - непарне,

Це означає, що rand()є однаковий шанс бути парним чи непарним десятковим .

З іншого боку, rand() * rand()чи є шанси складені трохи інакше. Скажімо:

double a = rand();
double b = rand();
double c = a * b;

aі bобидва мають 50% -ний шанс бути парним або непарним. Знаючи це

  • навіть * навіть = рівний
  • парний * непарний = парний
  • непарні * непарні = непарні
  • непарний * парний = парний

означає , що є 75% вірогідність того, що cнавіть, в той час як тільки 25% вірогідність того, що це дивно, що робить вартість rand() * rand()більш передбачуваною , ніж rand(), отже , менш випадковим чином .


rand()Зазвичай дає число від 0 до 1. Чи має сенс говорити про те, чи це парне чи непарне?
Teepeemm

1
Насправді, 0.2*0.2=0.04що припускає принциповий недолік при такому підході: множення 53 біт на два подвійні отримає приблизно 100 біт в результаті. Але остання половина цих бітів буде відкинута. Тож, якщо ви берете два парні з 1, як їх найменший значущий біт, ви нічого не можете сказати про найменш значущий біт їхнього продукту.
Teepeemm

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

0

Використовуйте лінійний регістр зсуву зворотного зв'язку (LFSR), який реалізує примітивний поліном.

Результатом буде послідовність 2 ^ n псевдовипадкових чисел, тобто жодне, що повторюється в послідовності, де n - кількість бітів в LFSR ...., що призводить до рівномірного розподілу.

http://en.wikipedia.org/wiki/Linear_feedback_shift_register http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

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

Наприклад, 32-розрядний LFSR буде генерувати 2 ^ 32 унікальних числа в послідовності (не 2 подібних), починаючи з заданого насіння. Послідовність завжди буде в одному порядку, але початкова точка буде різною (очевидно) для різних насінин. Отже, якщо можливо повторювана послідовність між посівом не є проблемою, це може бути хорошим вибором.

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


0

Якщо припустити, що rand()повертає число між [0, 1)собою, очевидно, що воно rand() * rand()буде зміщене до 0. Це пов'язано з тим, що множення xна число між собою [0, 1)призведе до числа, меншого від x. У цих були черги 10000 більш випадкових чисел:

Якщо rand()повертає ціле число між, [x, y]тоді ви маєте такий розподіл. Зауважте кількість непарних та парних значень:


-1

Гаразд, тому я спробую додати деяке значення, щоб доповнити інші відповіді, сказавши, що ви створюєте та використовуєте генератор випадкових чисел.

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

  • Ентропія: як у ентропії Шеннона
  • Розподіл: статистичний розподіл (пуассон, нормальний тощо)
  • Тип: джерело чисел (алгоритм, природна подія, комбінація тощо) та застосований алгоритм.
  • Ефективність: швидкість або складність виконання.
  • Шаблони: періодичність, послідовності, прогони тощо.
  • і, мабуть, більше ...

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


-1

Неважко показати, що сума двох випадкових чисел не обов'язково є випадковою. Уявіть, що у вас 6-гранний штампок і рулон. Кожне число має 1/6 шансів на показ. А тепер скажіть, що у вас було 2 кубики, і підсумуйте результат. Розподіл цих сум не 1/12. Чому? Тому що певні числа з’являються більше, ніж інші. Є кілька розділів . Наприклад, число 2 - це сума лише 1 + 1, але 7 може бути утворено 3 + 4 або 4 + 3 або 5 + 2 і т. Д. ... тож у неї більше шансів з'явитися.

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


-1

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

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

Щоб повернутися до справжнього питання. У цьому терміні немає більш-менш випадкових випадків:

обидва виявляються випадковими !

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

наприклад: Чи погода випадкова? У нас недостатньо датчиків або знань, щоб визначити, погода випадкова чи ні.


-2

Відповідь буде, це залежить, сподіваємось, rand () * rand () буде більш випадковим, ніж rand (), але як:

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

Що ж, якщо ви перевірите щось із зазначеного вище, я пропоную вам скористатися простим "rand ()". Тому що ваш код був би читабельнішим (не запитував би себе, чому ви це написали, за ... ну ... більше 2 сек), простий у обслуговуванні (якщо ви хочете замінити функцію rand на super_rand).

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

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