Генератор випадкових чисел з
Правила та умови
На форумі заборонено:
Порушники правил будуть суворо покарані модераторами або адміністратором форуму і їм буде повністю закритий доступ на форум.
Використовуючи цей форум Ви можете:
У цій статті докладно поговоримо про генерації випадкових чисел (Примітка. Правильніше буде сказати "псевдовипадкові числа", тому що жоден алгоритм не може виробити справді випадкове число, але для зручності я буду опускати слово "псевдо"). Досить часто в програмуванні потрібно отримувати випадкові числа для виконання будь-яких дій. Перше, що спало для прикладу, це тасування карт в карткових іграх або, наприклад, гра в "кістки", яка також вимагає генерації випадкових чисел для моделювання кидання "кісток". Прикладів можна навести скільки завгодно, особливо щодо комп'ютерних ігор.
Для того, щоб отримати випадкове число можна, звичайно, написати і свою функцію, а можна використовувати і стандартні бібліотечні. Ми ж з вами не будемо "винаходити велосипед", і тому будемо користуватися тільки стандартними бібліотечними функціями. Отже, для генерації випадкових чисел в С ++ використовують функцію rand (). описану в бібліотеці stdlib.h. Як вона працює, розглянемо на простому прикладі.
Як бачите, тут все просто: підключаємо необхідну бібліотеку, через директиву препроцесора #include і використовуємо функцію rand () в програмі. Спробуйте запустити програму і подивитися вироблене нею число. А потім спробуйте запустити програму ще кілька разів. Напевно, ви помітили, що при кожному новому запуску функція rand () генерує одне і те ж число. Так це дійсно так! Але чому? Давайте розбиратися разом.
Технічний момент. Оскільки rand () - це функція, то у неї є свій прототип (опис), в якому вказується, що вона може отримувати як аргумент (аргументів) і що повертає. Ось її прототип (його можна знайти і самостійно в файлі stdlib.h, який зазвичай знаходиться в папці include вашої середовища програмування):
Як бачите, функція повертає цілі числа (від 0 до 32767), в якості аргументів вона не може нічого приймати, тобто всередині дужок буде завжди порожньо.
Продовжуємо розбиратися. Щоб зрозуміти, чому функція rand () завжди нам повертає одне і те ж число, заглянемо всередину її. Ось, що ми там побачимо
Не будемо вдаватися в подробиці коду. Скажу лише те, що отримане випадкове число за допомогою цієї функції, залежить від стартового числа next. яке, як ви бачите, встановлено в одиницю. Звідси і випливає, що числа завжди виходять однаковими. Для того, щоб уникнути цієї проблеми, в парі з rand () потрібно використовувати функцію srand (). Ось її прототип
А ось і її нутро
Як бачите, ця функція змінює стартове число next, привласнюючи йому іншу величину, отримувану функцією як аргумент. В принципі, це число можна вводити кожен раз вручну, наприклад, так
В цьому випадку, вводячи різні значення змінної seed. ми будемо отримувати різні випадкові величини на виході. Як ви розумієте, це не дуже зручно. Найчастіше в якості переданої величини в функцію srand () використовують системний час в секундах. Погодьтеся, що це найкращий спосіб, тому що це число буде завжди різним, а відповідно, ми будемо отримувати на виході з rand () випадкові числа.
Тепер потрібно подумати, як передати в функцію srand () поточний системний час. А відповідь проста: для цього є бібліотечна функція time (). описана в бібліотеці time.h. Ось її прототип
Не лякайтеся назвою типу, тому що його можна прирівняти до звичайного int. Для того, щоб ця функція повертала поточний час в секундах (секунди відраховуються від 00:00:00), потрібно викликати її з параметром NULL. Вийде ось так
Тепер розглянемо ось таке питання. Припустимо, що нам потрібно генерувати число не на всьому допустимому інтервалі, а тільки в якомусь певному, наприклад, від 0 до 9 включно. Як ми вчинимо в даному випадку? У функції rand () є свій синтаксис
де a - це початкова точка, з якої починається генерація,
b - це величина зсуву, яка визначає інтервал, на якому буде проводитися генерація.
У нашому випадку a = 0 (це число йде включно), b = 10 (а це буде не включно, тому що це не кінцева точка, а величина зсуву. Якщо від 0 відкласти 10 чисел, то останнім буде 9 включно). Якби потрібно було генерувати числа в інтервалі, наприклад, від 30 до 50 включно, то було б так
Експериментуйте з програмою вище, поспостерігайте за одержуваними величинами. Спробуйте зробити що-небудь своє, щоб краще розібратися з генерацією випадкових чисел в С ++. Також можу порадити поекспериментувати з додаванням в srand () функції clock (). повертає приблизне процесорний час витрачений на роботу з програмою. Ось така ось буде рядок
У деяких випадках можливе отримання більш випадкових величин, хоча, особисто я, принципової різниці не помічав.
Тепер ще один момент: отримання негативних значень. Припустимо, що нам потрібно отримувати випадкові величини в інтервалі від -100 до +100. Рядок коду, що відповідає за рандомізацію, буде такою
І останній момент, це отримання чисел з плаваючою точкою, тобто дрібних. Наприклад, потрібно отримати числа на інтервалі від 0.01 до 1. Дивимося код
На завершення статті напишу невелику програму, яка запитує у користувача інтервал генерації випадкових чисел, заповнює отриманими величинами двовимірний масив (матрицю) і виводить її на екран
Тут єдине зауваження по коду, яке потрібно пояснити докладніше - це рядок
Оскільки користувачу зручніше вводити нижній і верхній індекси рандомізації, а не величину зсуву в другому випадку, то ми виробляємо деякі математичні обчислення. Припустимо, що користувач ввів 10 і 20, тоді в результаті отримаємо такий рядок коду
що і було потрібно.
Результат роботи програми
