Треки
/
Julia
Julia
/
Вправи
/
Проблемні ймовірності
Проблемні ймовірності

Проблемні ймовірності

Навчальна вправа

Вступ

Rational numbers (раціональні числа) - це дроби, у яких чисельник і знаменник виражені цілими числами.

Наприклад, ми можемо зберегти 2//3 як точний дріб замість наближеного значення Float64 0.6666...

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

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

Створення раціональних чисел

Створити їх так само просто, як поставити // між двома цілими числами.

julia> 3//4
3//4

julia> a = 3; b = 4;

julia> a//b
3//4

Спільні множники автоматично скорочуються, тобто дріб зводиться до «найменших членів»: найменших цілих чисел, які точно представляють дріб, з невідʼємним знаменником.

julia> 5//15
1//3

julia> 5//-15
-1//3

Арифметика з раціональними числами

Звичайні arithmetic operators + - * / ^ % працюють із раціональними числами практично так само, як з іншими числовими типами.

Цілі числа та інші Rational можна включати у вираз, і результат теж буде Rational. Якщо у виразі є float, результат теж буде float, що може призвести до втрати точності.

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

julia> 3//4 + 1//3  # addition
13//12

julia> 3//4 * 1//3  # multiplication
1//4

julia> 3//4 / 1//3  # division
9//4

julia> 3//4 ^ 2  # exponentiation
3//16

julia> 3//4 + 5  # rational and int => rational
23//4

julia> 3//4 + 5.3  # rational and float => float
6.05

julia> float(3//4)  # casting
0.75

Інші операції

У Julia раціональні числа - це просто числа. Компілятор зазвичай сам перетворює типи, коли це потрібно.

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

julia> 3//4 == 0.75
true

julia> 3//4 < 0.74
false

В інших випадках, щоб порівняти, Rational слід привести до Float:

julia> 1//3 == 1/3
false

julia> float(1//3) == 1/3
true

Математичні функції приймають раціональні числа на вхід, але можуть повертати результат із плаваючою комою:

julia> sqrt(9//16)
0.75

Вказівки

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

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

Було проведено два типи досліджень:

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

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

1. Наведіть відношення успіхів до спроб

Функція rationalize(successes, trials) приймає два масиви, successes і trials. Для індексу i елемент successes[i] відповідає кількості успіхів, що сталися за trials[i] спроб. Функція повертає масив раціональних чисел, тобто відношень успіхів до кількості спроб, у тому самому порядку, що й вхідні масиви.

julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
 1//4
 2//5
 1//2

2. Знайдіть дійсні ймовірності за співвідношенням успіхів і спроб

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

julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
 0.25
 0.4
 0.5

3. Перевірте середнє ймовірностей

Функція checkmean(successes, trials) приймає два масиви, successes і trials. Вона порівнює середнє дійсних ймовірностей із середнім раціональних ймовірностей.

  • Якщо ці дві ймовірності рівні, checkmean повертає true
  • Якщо ці дві ймовірності різні, checkmean повертає раціональну ймовірність.
julia> successes, trials = [9, 4, 7, 8, 6], [22, 22, 11, 17, 12];
julia> checkmean(successes, trials)
true

julia> successes, trials = [6, 5, 9, 8, 9], [21, 19, 13, 25, 22];
julia> checkmean(successes, trials)
1873629//4754750

4. Перевірте незалежну ймовірність

Функція checkprob(successes, trials) приймає два масиви, successes і trials. Вона порівнює сумарну ймовірність, обчислену з чисел з плаваючою комою, із сумарною ймовірністю, обчисленою з раціональних чисел.

  • Якщо ці дві ймовірності рівні, checkprob повертає true
  • Якщо ці дві ймовірності різні, checkprob повертає раціональну ймовірність.
julia> successes, trials = [2, 9, 4, 4, 5], [15, 11, 17, 19, 15];
julia> checkprob(successes, trials)
true

julia> successes, trials = [9, 8, 5, 4, 3], [22, 14, 19, 25, 18];
julia> checkprob(sucesses, trials)
12//7315
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Julia Exercism

Час розпочати Проблемні ймовірності?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Julia, а також 35 концепцій128 вправ та справжнє наставництво від людей, і все це безкоштовно.