Генератор випадкових чисел з

Правила та умови

На форумі заборонено:

Порушники правил будуть суворо покарані модераторами або адміністратором форуму і їм буде повністю закритий доступ на форум.

Використовуючи цей форум Ви можете:

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

Для того, щоб отримати випадкове число можна, звичайно, написати і свою функцію, а можна використовувати і стандартні бібліотечні. Ми ж з вами не будемо "винаходити велосипед", і тому будемо користуватися тільки стандартними бібліотечними функціями. Отже, для генерації випадкових чисел в С ++ використовують функцію 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, тоді в результаті отримаємо такий рядок коду

що і було потрібно.

Результат роботи програми

Генератор випадкових чисел з