Re: swap [Вирішено]; random
один із варіантів, вказати що x - дробове
але %, не працює з дробовими числами.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → swap [Вирішено]; random
один із варіантів, вказати що x - дробове
але %, не працює з дробовими числами.
Дарма. Сміливішим треба бути. Щоб з цілого отримати дробне, його треба (ЗНЕНАЦЬКА) поділити! От і все. На що саме? Залежить від того, що саме вам треба отримати. Ось вам дробні числа від 0.0 до 0.99 з кроком 0.01:
double x = ( rand() % 100 ) / 100.0;
Наступна загадка: чому саме 100.0, а не 100?
тому що 100 автоматично перетвориться у тип int і тоді нічо не зміниться. А так ми вказали, що 100.0 доробове
Дякую!!!
Абож ось так
double x = ( rand() % 100 ) / (double)100;
Напишіть вираз для випадкового числа з проміжку (a,b) із кроком h (всі - double) і закриваємо тему
ну заки я визначився як зробити правильний крок. Оскільки 100.0 і 00.1 - трошка різні числа, а h - буде вводитися саме 00.1 таким чином.
p.s. числа 100.0 і 00.1 я взяв для прикладу, щоб показати що я зотів сказати
x = a + h * rand() % ( ( b - a ) / h );
Заки зробив правильно коли a і b типу int
Маю відлучитися на 5 хвилин.
Неправильно. Хай a = 100, b = 200, h = 0.1. Тоді
rand() % (b+1-a) ∈ [0; 101)
rand() % (b+1-a) + a ∈ [100; 201)
(rand() % (b+1-a) + a) * h ∈ [10; 20.1)
Ух тоді я запутався. Потрібен час.
Ну ось такий вираз начебто працює для цілих чисел
rez = (rand() % (b+1-a) + a);
оооо. Я трошка в'їхав. Це можна розкласти ось так:
rez = (rand() % (b+1-a) + a);
rez *= h;
А тут 1 рядок видає норм ціле число від int a до int b;
а у наступному рядку, виникає певний колапс.
Для прикладу 1 рядок rez = 123; тоді 2 рядок = 123 * 0,1 = 12,3
І ось тут максимальним значенням вже може бути тільки 20.0
Ух тоді я запутався. Потрібен час.
x = h * ( a + rand() * ( b - a ) / h );
Ну так h буде вводитися не 100,0 а 0,01 (для прикладу)
А тут тепер його ще тре перетворити з 0,01 до 100,0.
Я так зрозумів це правильна відповідь. Якось не побачив раніше коли писав повідомлення.
Але не все зрозуміло.
Чому ми ділимо на h? Є ще питання але спершу це.
x = h * ( a + rand() * ( b - a ) / h );
Взагалі за допомогою яких чарів ви все це обрахували? Як ви це все зробили?
Вибачте, вчора нашвидкоруч писав і таки помилився. Правильна формула вище записана.
А як отримана? Ну дуже просто: нам потрібні значення від a до b з кроком h: a, a + h, ..., a + i * h, ..., b
Останній коефіціент можна знайти з a + i * h = b => i = ( b - a ) / h. Отже, щоб отримати потрібну кількість випадкових чисел, треба зробити
rand() % ( ( b - a ) / h )
Щоб ці числа були з кроком h, треба зробити
h * rand() % ( ( b - a ) / h )
а щоб починалися з a
a + h * rand() % ( ( b - a ) / h )
Єдине питання - це дає змогу тримати числа в діапазоні від a (включно) до b (невключно), але то вже технічні дрібниці.
koala, а ви взагалі людина, чи суперкомп'ютер з майбутнього?
На вигляд все не так і важко, але сам я б довго думав. (у мене тверде 10+ з математики).
дякую ще раз.
Це просто лінійне перетворення. Після 1 семестру будете таке в голові робити, якщо лінійна алгебра буде
Особлива подяка Наталії Дмитрівні
лінійне перетворення
Може ви порадите якусь статтю/відео/чи ще щось почитати (не по С++, а саме по цій темі)
Дякую, koala. Можливо я повторюся але you are in real cool !!!
С++, як це давно було. Року 3 назад вивчала його. А зараз вже багато чого не пам'ятаю, на жаль, так як не використовую його