Srand time null что это

Случайные числа в C++: функции rand() и srand()

Рассмотрим, как генерировать случайные числа в C++.

В центре нашего внимания будет функция rand(), которая используется для генерации числа от 0 до RAND_MAX. Где RAND_MAX – это значение, которое меняется в зависимости от используемого компилятора (обычно 32767).

В следующем примере вы увидите, как сгенерировать число от 0 до 999:

Генерация случайного числа в пределах диапазона: оператор модуля (%)

Команда rand()%1000 генерирует целое число в диапазоне от 0 до 999.

Если использовать инструкцию rand()%N, то в действительности мы получим число от 0 до N-1.

Чтобы установить максимум, используется оператор модуля (%), который, как мы знаем, используется для вычисления остатка от целочисленного деления, и это объясняет, почему максимальное значение может быть N-1!

Так, любое число, делящееся на 5, может дать в качестве остатка 0, 1, 2, 3 и 4… оно не может дать 5, потому что иначе мы имели бы целочисленное деление без остатка!

В последней инструкции мы добавили +5 (это называется смещением) к обоим числам в диапазоне (меньшему и большему).

Случайное число всегда одно и то же!

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

Вы заметите, что каждый раз, когда вы запускаете код, вы всегда получаете одно и то же число!

Но как это возможно? Разве это не должен был быть генератор случайных чисел?

Объяснение этого явления связано с функцией rand(): она, по сути, не генерирует истинно случайное число, а просто возвращает следующее псевдослучайное значение в последовательности значений от 0 до RAND_MAX.

Поэтому для получения случайного числа необходимо изменить начальную точку (seed) этой последовательности с помощью функции srand().

Генерация случайного числа с помощью srand() и time()

Для этого нам нужно дополнить код, который мы видели ранее, функциями srand() и time().

Давайте посмотрим пример с использованием простого цикла for для создания не одного, а 10 случайных чисел:

Функция srand() используется для инициализации функции генерации случайных чисел: без нее программа всегда извлекала бы одни и те же случайные числа из одного и того же семени.

Трюк для рандомизации seed заключается в том, чтобы установить его с помощью time(NULL) или time(0), встроив соответствующую функцию, найденную в библиотеке ctime (которую мы включили в наш проект).

Обратите внимание, что в первом примере, предложенном в этой статье, функция srand() отсутствовала: каждый раз, когда используется rand() без выполнения программистом команды srand(), как если бы была установлена srand(1)… вот почему предыдущий пример всегда возвращал одно и то же число!

Источник

BestProg

Содержание

Поиск на других ресурсах:

Функция возвращает случайное целочисленное значение, которое лежит в пределах от 0 до 32767.

Пример.

Результат выполнения программы

Функция srand() из библиотеки stdlib.h предназначена для установки начальной точки, из которой происходит генерирование случайных чисел. Синтаксис объявления функции следующий:

Пример.

Результат выполнения программы

Как видно из примера в п. 2, последовательность случайных чисел изменилась. Если в функции srand() вместо числа 55 установить другое число, то будет получена другая последовательность. Однако, текст программы статический и при многократном запуске программы это число будет неизменным. В результате будет получаться одна и та же последовательность случайных чисел. Во избежание этого недостатка, нужно чтобы стартовое значение в функции srand() постоянно изменялось.

Если эти миллисекунды поместить в функцию srand() как показано ниже

Пример. В примере демонстрируется генерирование последовательности из двух случайных чисел. Каждый раз при запуске программы будет получена новая последовательность.

Результат выполнения программы

4. Как сгенерировать случайное целое число в заданных пределах? Пример
5. Заполнение двумерной матрицы случайными целыми числами в указанных пределах. Пример

Условие задачи. Дана двумерная матрица порядка n ( n столбцов, n строк) целых чисел. Найти наибольшее из значений элементов, которые размещены в закрашенной части матрицы. Значение элементов матрицы формируются случайным образом и находятся в пределах [-5; +5].

Текст программы следующий

6. Как сгенерировать случайное число с плавающей запятой в указанных пределах? Пример

Источник

srand (time (NULL)) «Функция ‘srand’ не может быть решена.»

Я пытался отладить эту проблему некоторое время и, честно говоря, я просто не вижу, что я делаю неправильно.

Почему есть синтаксическая ошибка?

«Функция« srand »не может быть решена».

Как я решил проблему:

Это было связано с компилятором MinGW, который я использовал. Переход на Visual Studio решил проблему.

Решение

; в конце #include Директивы являются проблемой в вашем коде. #include Директивы не нуждаются (неправильно ставить) точки с запятой в конце, в отличие C++ заявления.

Кажется, любой персонаж после > в директиве вызывает эту ошибку / предупреждение.

РЕДАКТИРОВАТЬ:

Что касается вопроса компоновщика:

Вместо того, чтобы использовать stdlib.h попробуйте использовать попробуйте, если это поможет. Потому что он использует пространство имен.

РЕДАКТИРОВАТЬ:

Цитируется из этого вопроса:

Теперь я считаю, что это проблема анализа кода. Лучшее решение
отредактировать параметры анализа кода, чтобы сделать «Функция не может быть
решено «быть предупреждением, а не ошибкой. Таким образом, вы можете увидеть
предупреждения в представлении «Проблемы», но продолжают работать. Если функция
ДЕЙСТВИТЕЛЬНО отсутствует, компилятор скажет вам! У меня также есть новая теория,
что проблема с анализатором кода, следующим по символическим ссылкам, потому что
все «отсутствующие» функции находятся в символических включаемых файлах. Было бы
люблю любой вклад в эту теорию.

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

Источник

srand() — why call it only once?

This question is about a comment in this question Recommended way to initialize srand? The first comment says that srand() should be called only ONCE in an application. Why is it so?

Srand time null что это. WtEI9. Srand time null что это фото. Srand time null что это-WtEI9. картинка Srand time null что это. картинка WtEI9

7 Answers 7

That depends on what you are trying to achieve.

Randomization is performed as a function that has a starting value, namely the seed.

So, for the same seed, you will always get the same sequence of values.

If you try to set the seed every time you need a random value, and the seed is the same number, you will always get the same «random» value.

To avoid this problem, srand is set only once per application, because it is doubtful that two of the application instances will be initialized in the same second, so each instance will then have a different sequence of random numbers.

However, there is a slight possibility that you will run your app (especially if it’s a short one, or a command line tool or something like that) many times in a second, then you will have to resort to some other way of choosing a seed (unless the same sequence in different application instances is ok by you). But like I said, that depends on your application context of usage.

Also, you may want to try to increase the precision to microseconds (minimizing the chance of the same seed), requires ( sys/time.h ):

Generally we use the time (NULL) returned seconds value when initializing the seed value. Say the srand (time (NULL)); is in a loop. Then loop can iterate more than once in one second, therefore the number of times the loop iterates inside the loop in a second rand call in the loop will return the same «random number», which is not desired. Initializing it once at program start will set the seed once, and each time rand is called, a new number is generated and the internal state is modified, so the next call rand returns a number which is random enough.

The internal state next is declared as global. Each myrand call will modify the internal state and update it, and return a random number. Every call of myrand will have a different next value therefore the the method will return the different numbers every call.

But depending on your needs you can set the seed to some certain value to generate the same «random sequence» each run, say for some benchmark or others.

Srand time null что это. w1393. Srand time null что это фото. Srand time null что это-w1393. картинка Srand time null что это. картинка w1393

Short answer: calling srand() is not like «rolling the dice» for the random number generator. Nor is it like shuffling a deck of cards. If anything, it’s more like just cutting a deck of cards.

Think of it like this. rand() deals from a big deck of cards, and every time you call it, all it does is pick the next card off the top of the deck, give you the value, and return that card to the bottom of the deck. (Yes, that means the «random» sequence will repeat after a while. It’s a very big deck, though: typically 4,294,967,296 cards.)

So what does srand do? Based on the analogy I’ve been building here, calling srand(n) is basically like saying, «cut the deck n cards from the top». But wait, one more thing: it’s actually start with another brand-new deck and cut it n cards from the top.

[P.S. Yes, I know, in real life, when you buy a brand-new deck of cards it’s typically in order, not in random order. For the analogy here to work, I’m imagining that each deck you buy from the game shop is in a seemingly random order, but the exact same seemingly-random order as every other deck of cards you buy from that same shop. Sort of like the identically shuffled decks of cards they use in bridge tournaments.]

Addendum: For a very cute demonstration of the fact that for a given PRNG algorithm and a given seed value, you always get the same sequence, see this question (which is about Java, not C, but anyway).

Источник

Генерация случайных чисел в языке Си

Пожалуйста, приостановите работу AdBlock на этом сайте.

Иногда может возникнуть необходимость в генерации случайных чисел. Простой пример.

Пример: Определение победителя в конкурсе репостов.

Как получить число от игрока, вам уже известно. А вот как заставить компьютер загадать случайное число? В этом уроке вы этому научитесь.

Функция rand().

Давайте посмотрим на эту функцию в действии. Запустим следующий код:

Должно получиться что-то вроде этого.

Srand time null что это. rand. Srand time null что это фото. Srand time null что это-rand. картинка Srand time null что это. картинка rand

Рис.1 Пять случайных чисел, сгенерированных функцийе rand

Ограничить случайные числа сверху.

Srand time null что это. rand do 100. Srand time null что это фото. Srand time null что это-rand do 100. картинка Srand time null что это. картинка rand do 100

Рис.2 Пять случайных чисел меньше 100

Ограничить числа снизу.

Задать границы функции rand сверху и снизу.

Попробуйте запустить эту программу. Удивлены?

Согласно этой формуле перепишем нашу последнюю программу:

Srand time null что это. rand a b. Srand time null что это фото. Srand time null что это-rand a b. картинка Srand time null что это. картинка rand a b

Рис.3 Случайные числа из диапазона [80;100]

Но прежде ещё немного полезной информации. Запустите последнюю программу три раза подряд и записывайте себе случайные числа, которые она генерирует. Заметили?

Функция srand().

Скомпилируйте и запустите несколько раз вот эту программу:

Теперь поменяйте аргумент функции srand() на другое число (надеюсь вы ещё не забыли, что такое аргумент функции?) и снова скомпилируйте и запустите программу. Последовательность чисел должна измениться. Как только мы меняем аргумент в функции srand – меняется и последовательность. Не очень практично, не правда ли? Чтобы изменить последовательность, нужно перекомпилировать программу. Вот бы это число туда подставлялось автоматически.

Практика

Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим Srand time null что это. step full. Srand time null что это фото. Srand time null что это-step full. картинка Srand time null что это. картинка step full

Исследовательские задачи для хакеров:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *