Псевдослучайни числа
Функции Rand () и srand ()
Езиците за програмиране обикновено предоставят функции за генериране на случайни числа в рамките на обхвата по подразбиране. Всъщност се генерират не случайни числа, а така наречените псевдослучайни числа; те изглеждат случайни, но се изчисляват по много специфична формула. Но за простота, по-долу ще ги наричаме случайни.
В езика за програмиране C можете да получите произволно число, използвайки функцията rand (), която е включена в стандартната библиотека на езика. Тази функция не взема параметри.
Задачата
Напишете програма, която присвоява резултата от функцията rand () на целочислена променлива. Показва стойността на променлива на екрана.
Функцията rand () връща цяло число от 0 до стойността, присвоена на константата RAND_MAX. Стойността RAND_MAX зависи от системата и е дефинирана в заглавния файл stdlib.h. Така например, това може да бъде 32767 (двубайтово цяло число) или 2147483647 (четирибайтово цяло число).
Задачата
Определете стойността RAND_MAX във вашата система. За да направите това, не забравяйте да включите заглавния файл stdlib.h към файла с изходния код.
Кодът по-долу показва 50 произволни числа:
Тялото на цикъла се премества на нов ред след всеки пет числа, показани на екрана. За целта се използва израз, който съдържа остатъка от разделяне на i на 5, резултатът се сравнява с 0. За да се предотврати нов ред след първото число, първо се присвоява единица, а не нула (тъй като 0 се дели на 5 без остатък).
Задачата
Вижте кода по-горе. Стартирайте програмата няколко пъти, като същевременно забелязвате дали получавате различни резултати от тичане до изпълнение.
Трябваше да забележите, че всеки път, когато стартирате програмата, цифрите остават същите. Дори ако прекомпилирате програмата, резултатът няма да се промени. Този ефект се дължи на факта, че първоначалното (инициализиращо) число, което е заместено във формулата за изчисляване на първото и следващите псевдослучайни числа, винаги е еднакво за всяка система. Това семе обаче може да бъде променено с помощта на функцията srand (), която се предава на всяко цяло число като параметър. Ясно е, че ако дадете конкретен аргумент на функцията, например srand (1000), тогава номерата ще бъдат еднакви от обаждане до повикване на програмата. Макар и не това, което биха били без srand (). Следователно възниква проблемът, как да направим аргумента за srand () също случаен? Оказва се омагьосан кръг.
Задачата
Препроектирайте програмата, която отпечатва 50 произволни числа на екрана, така че първо потребителят да бъде подканен за всяко цяло число, използвайки scanf (), което ще бъде предадено на функцията srand () .
Потребителят на програмата може сам да зададе стойността за инициализация. Но по-често това не е пълноценен изход от ситуацията. Следователно стойността на инициализацията е свързана с някакъв процес, работещ в операционната система, например с часовник. Времето (като се има предвид не само времето на деня, но и датата) никога не е същото. Така стойността за srand (), преобразувана в цяло число от системното време, ще бъде различна.
Текущото време може да бъде намерено с помощта на функцията time (), чийто прототип е описан във файла time.h. Чрез предаване на time () като параметър NULL, получаваме цяло число, което може да бъде предадено на srand ():
srand (време (NULL));
Задачата
Преработете програмата си така, че стойността на инициализацията да зависи от системното време.
Вземете произволни цели числа в дадени диапазони
Функцията rand () генерира произволно число между 0 и RAND_MAX. Какво да направите, ако трябва да получите произволни числа в други диапазони, например от 100 до 999?