Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lesson_7 генератор_ инициализация массива.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
133 Кб
Скачать
☆

Использование функции srand.

Местоположение функции - библиотека stdlib.h.

Функция srand устанавливает начальную точку для генерации случайных чисел и обладает следующим синтаксисом:

void srand(unsigned int start)

Параметр start, который принимает функция, и есть - новая точка для генерации случайного числа. Давайте подумаем, какое же число вписать на место этого параметра. Целочисленный литерал или переменная, значение которой опредленно в момент написания программы - не подходят. Передав их на место отправной точки мы непременно изменим ее, но не сделаем динамической. И, числа будут генерироваться другие, но все еще одинаковые при каждом запуске.

Примеры программ с использованием литерала и переменной в качестве отправной точки:

#include <iostream>

#include <stdlib.h> //в этом файле содержится функция rand

using namespace std;

void main ()

{

srand(10);

int i=rand(); //генерация случайного числа и запись его в переменную i

cout << i << "\n";

cin.get();

cin.get();

}

#include <iostream>

#include <stdlib.h> //в этом файле содержится функция rand

using namespace std;

void main ()

{

int a = 10;

srand(a);

int i=rand(); //генерация случайного числа и запись его в переменную i

cout << i << "\n";

cin.get();

cin.get();

}

Результат и там и там - одинаковый!!!

В программе использован тип unsigned, что является сокращением от unsigned int. Число типа int занимает при хранении по меньшей мере два байта (четыре байта на современных популярных 32-битных системах) и может принимать как положительные, так и отрицательные значения. Переменная типа unsigned int также хранится по крайней мере в двух байтах памяти. Двухбайтовое число unsigned int может принимать только неотрицательные значения в диапазоне 0-65535. Четырехбайтовое unsigned int может принимать неотрицательные значения в диапазоне 0-4294967295. Функция srand получает в качестве аргумента unsigned int.

Еще один пример с использованием функции srand (), используя в качестве отправной точки некоторое введенное число с клавиатуры:

#include <iostream>

#include <iomanip>

#include <stdlib.h> //в этом файле содержится функция rand

using namespace std;

void main ()

{

setlocale (LC_CTYPE, "russian");

unsigned a; // хранит введенное пользователем отправную точку

cout << "Введите отправную точку: ";

cin >> a;

srand(a); // засеять генератор случайных чисел

for (int i=1; i<=20; i++)

{

cout << setw(5) << (1+rand()%6); //получить случайное число от 1 до 6 и вывести его

if ( i%5 == 0 ) // если counter делится на 5, начать новую строку вывода

cout << endl;

}

cin.get();

cin.get();

}

Введите отправную точку: 1

6 6 5 5 6

5 1 1 5 3

6 6 2 4 2

6 2 3 4 1

Для продолжения нажмите любую клавишу . . .

Введите отправную точку: 2

4 3 1 6 1

1 5 2 2 5

2 2 5 1 6

4 6 2 5 6

Для продолжения нажмите любую клавишу . . .

Введите отправную точку: 1

6 6 5 5 6

5 1 1 5 3

6 6 2 4 2

6 2 3 4 1

Для продолжения нажмите любую клавишу . . .

В случаях введения одинаковых чисел (в 1 и 3 вводе) в качестве отправной точки – у нас будет одинаковый ряд «случайных чисел».

Типичная ошибка программирования

Использование srand вместо rand при попытке генерации случайных чисел приводит к ошибке компиляции, поскольку функция srand не возвращает значения.

Если производить рандомизацию, не вводя каждый раз значения семени, можно написать оператор вроде srand( time( 0 ) ) ;

Тогда для автоматического получения семени компьютер будет считывать показания своих часов. Функция time (с аргументом 0, как написано в приведенном операторе) текущее время как число секунд, прошедших с полуночи 1 января 1970 года по Гринвичу (GMT). Это значение преобразуется в целое типа unsigned и используется в качестве семени генератора случайных чисел. Прототип функции time находится в <time.h>.

Использование функции time.

Местоположение функции - библиотека time.h.

У функции time есть несколько предназначений и подробно разбирать мы ее не будем. Возьмем только то, что необходимо нам для работы. А, именно, если функцию time вызвать с параметром NULL, то на место своего вызова в программе, эта функция вернет количество миллисекунд прошедших с 1 января 1970 года. Согласитесь, что эта величина каждый раз будет разной. А, это - как раз то, что мы искали. "Соберем" полученную информацию в единое целое и получится:

Идентичные записи:

srand ((unsigned int) time(NULL));

srand ((unsigned int) time(0));

srand ((unsigned) time(NULL));

srand (time(0));

Функция srand устанавливает в качестве стартовой точки число, представляющее собой количество, миллисекунд прошедших с 1 января 1970 года. Попробуем:

#include <iostream>

#include <time.h>

#include <stdlib.h> //в этом файле содержится функция rand

using namespace std;

void main ()

{

srand((unsigned) time(0));

int i=rand(); //генерация случайного числа и запись его в переменную i

cout << i << "\n";

cin.get();

cin.get();

}

Набрав исправленный пример, вы, конечно, убедились, что теперь при разных запусках программы генерируются разные числа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]