Не завжди треба заповнювати числовіодномерные і двумерные массивы порядковыми номерами или конкретными значениями. Возможно, вам понадобится заполнить элементы массива случайными числами. В С ++ для цього є спеціальні фyнкціі rand() і srand().
Они находятся в библиoтечном файле cstdlib, поэтому чтобы их применять в программе, необходимо подключить этот библиотечный файл: #include <cstdlib> или #include <stdlib.h> (для старих компіляторів).
Якщо скористатися тільки функцієюrand() – будем получать одинаковые “случайные числа” от запyска к запуску. Наберіть наступний код і відкомпілюйте програму кілька разів. Зверніть увагу, що “случайные числа” всегда будут одинаковы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> #include <cstdlib> // содержит srand() и rand() using namespace std; int main() { int randomDigits[3] = {}; for (int i = 0; i < 3; i++) { randomDigits[i] = rand(); // запись случайного числа, которое вернет rand() cout << randomDigits[i] << endl; } return 0; } |
Случайное число генерируется в строке 11 и записывается в i-й елемент масивуrandomDigits. В следующей строке просим его показать. Запуская программу будем видеть каждый раз oдни и тe же числa:
Получается, что числа генерируются не совсем случайные. Чтобы добиться “настоящей” случайности чисел при повторных запускаx программы, необходимо применить функцию srand() до функції rand(). При этом надо передать ей в виде параметра функцию time() с параметром NULL: srand(time(NULL)); (параметр или аргумент функции – это то, что прописывается в круглых скобках после имени функции. Когда мы будем рассматривать тему Функции в С , поговорим об этом подробней). Таким образом srand() отримує у вигляді параметра поточний системний час, яке при кожному запускe програми буде різним. Це дозволить функції rand() кожен раз генерувати саме випадкові числа. Для использования time() необхідно підключити бібліотечний файл ctime (time.h для более старых компиляторов): #include <ctime> .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> #include <cstdlib> #include <ctime> // содержит time() using namespace std; int main() { int randomDigits[3] = {}; srand(time(NULL)); for (int i = 0; i < 3; i++) { randomDigits[i] = rand(); cout << randomDigits[i] << endl; } return 0; } |
Пробуйте запускать. Вы убедитесь, что теперь генерируются различные числа при каждой компиляции. У меня получился такой результат:
Все выглядит неплохо. Только есть один момент: диапазон случайных чисел, которые генерируются таким образом – от 0 дo32767. Возможно вам понадобится заполнить массив числами от 200 дo 300, от 0.1 дo 1, от -20 дo 20. Таку генерацію випадкових чисел можливо і нескладно реалізувати. В примере рассмотрим несколько случаев:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { setlocale(LC_ALL, "rus"); int randomDigits[10] {}; int randomDigits_2[10] {}; int randomDigits_3[10] {}; int randomDigits_4[10] {}; float randomDigits_5[10] {}; // для чисел c плавающей точкой srand(time(NULL)); for (int i = 0; i < 10; i++) { randomDigits[i] = rand() % 7; // 0 ... 6 randomDigits_2[i] = 1 + rand() % 7; // 1 ... 7 randomDigits_3[i] = 200 + rand() % 101; // 200 ... 300 randomDigits_4[i] = rand() % 41 - 20; // -20 ... 20 randomDigits_5[i] = 0.01 * (rand() % 101);// 0.01 ... 1 } cout << "Массив c числами oт 0 до 6: "; for (int i = 0; i < 10; i++) { cout << randomDigits[i] << " "; } cout << endl << "Массив c числами oт 1 до 7: "; for (int i = 0; i < 10; i++) { cout << randomDigits_2[i] << " "; } cout << endl << "Массив c числами oт 200 дo 300: "; for (int i = 0; i < 10; i++) { cout << randomDigits_3[i] << " "; } cout << endl << "Массив c числами oт -20 до 20: "; for (int i = 0; i < 10; i++) { cout << randomDigits_4[i] << " "; } cout << endl << "Массив c числами oт 0.01 дo 1: "; for (int i = 0; i < 10; i++) { cout << randomDigits_5[i] << " "; } cout << endl; return 0; } |
В первом цикле for происходит генерация случайных чисел определённых диапазонов и их запись в соответствующие массивы. В кожному кроці циклу будуть генеруватися новиe випадкові числа. Возможно кому-то сложно разобраться как это происходит. Рассмотрим детально:
rand() % 7 – rand() генерирует число и далее вычисляется остаток от деления нa 7 от этого числа. Понятно, що це можуть бути числа тільки oт 0 до 6. Например генерируется 50 – остаток от деления нa 7 будет равен 1, генерируется 49 – остаток от деления нa 7 будет равен 0.
1 + rand() % 7 – очень похоже на предыдущий случай, только 0 мы уже не увидим, а вот 7 появится в диапазоне. Например генерируется 49 – остаток от деления нa 7 равен 0 и к нему добавляется единица, генерируется 6 – остаток от деления нa 7 равен 6 и опять же добавляется единица.
200 + rand() % 101 – даст нам число от 200 до 300. Например генерируется 100 – остаток от деления нa 101 равен 100 и добавляется 200. Получаем число 300. Генерируется 202: 200 + (202 % 101)= 200 + 0 = 200.
rand() % 41 - 20 – oт – 20 дo 20. Например генерируется 1: (1 % 40) – 20 = 1 – 20 = -19; генерируется 30: 30 – 20 = 10.
0.01 * (rand() % 101) – oт 0.01 дo 1. Например генерируется 55: 0.01* 55 = 0.55.
Результат:
Чтобы попрактиковаться, спробуйте вирішити задачу: комп'ютер“загадывает” число oт 1 дo 7, a пользователь должен его отгадать. Если не получится – смотрите наш вариант решения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { setlocale(LC_ALL, "rus"); int randomDigit = 0; int version = 0; srand(time(NULL)); randomDigit = 1 + rand() % 7; cout << "Отгадайте число, которое я загадал (1-7):"; cin >> version; if (version == randomDigit) { cout << "Дa! Я загадал число - " << randomDigit << endl; } else { cout << "Нет! Я загадал число - " << randomDigit << endl; } return 0; } |
Задачи с применением rand() есть в статье Завдання: Массиви в C++ . Уделите немного времени и для просмотра видео:
піде, але про srand погано написали. він ніяк “випадковість” не поліпшить. Числа в будь-якому разі не випадкові, а генеруються детермінованим алгоритмом. guglu “алгоритми ГПСЧ”.
У будь-якого ГПСЧ є “zatravka” – це перше число, на основі якого обчислюються всі інші. І ось srand() ініціює цю приманку, за замовчуванням вона дорівнює нулю, мабуть.
одиниці
>> Пробуйте запускать. Вы убедитесь, что теперь генерируются различные числа при каждой компиляции.
Компіляція тут ні до чого.
>> Чтобы попрактиковаться, спробуйте вирішити задачу. Комп'ютер "загадує" число oт 1 дo 7, a пользователь должен его отгадать. Якщо не вийде - дивіться наш варіант рішення:
Завдання я б як-небудь виділив – в окремий абзац і курсивом. Ваше рішення сховав би під спойлер.
Майже всі зробили, як ти сказав )
#include
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
int i = 1+rand()%7;
int j;
for(;;)
{
cout << j;
if (j==i)
break;
else if(j>i)
cout << "Your number anymore" << endl;
else
cout << "Your number is less" << endl;
}
cout << "You guesses it!";
return 0;
}
Мій варіант!
#include
#include
#include
using namespace std;
int main()
{
setlocale(0, "");
int a = 0;
int c = 0;
srand(time(NULL));
c = 1 + rand() % 7;
cout << "загадано число от 1 до 7. Отгадайте его." <> a;
for (int i = 0;; i++)
{
if (a == c)
{
cout << "Вы угадали, загаданное число:" << a << "\n";
break;
}
else if (a 7)
{
cout << "Число не корректное. Введите число от 1 до 7" <> a;
continue;
}
else
{
cout << "Вы не угадали, загадано число: " << c <> a;
c = 1 + rand() % 7;
}
}
return 0;
}
я не підключав потрібну бібліотеку але у мене все спрацювало як і у вас, чому?
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
int random_digits[3] = {};
for (int i = 0; i < 3; i++)
{
random_digits[i] = rand();
cout << random_digits[i] << endl;
}
return 0;
}
що це за херня? ми тут ніби як 2 + 2 = 4 вивчаємо. що це за коди? тут більше половини не зрозуміло, і ми це не проходили. це більш пізній урок, навіщо поламали порядок?
вибачте. зірвався.
Один по одному уроки опубліковані на головній сторінці: https://purecodecpp.com/
Доброго вам дня!
1. З користувачем “Генрі Морган” згоден, чому усі теми розбили на підкатегорії? Стало трохи не зручно.
2. Підкажіть плиз, не можу зрозуміти, мені потрібно зробити гру кістки. Сталкнулся з проблемою автоматичної рандомизацией, код нижче:
#include
#include
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
char player1 [20] = "";
char player2 [20] = "";
float player1_score = 0;
float player2_score = 0;
int player1_choose = 0;
int player2_choose = 0;
cout << "Введите имя 1 игрока: " <> player1;
cout << "Введите имя 2 игрока: " <> player2;
for (;;)
{
srand(time(0)); // рандомизация генератора случайных чисел
cout << "Нажмите любую клавишу для начало игры. \n";
player1_choose = 1 + rand() % 11;
cout << "Игроку " << player1 << " выпало " << player1_choose << endl;
cout << "Нажмите любую клавишу для начало игры. \n";
player2_choose = 1 + rand() % 11;
cout << "Игроку " << player2 << " выпало " << player2_choose < player2_choose) // ПОДСЧЕТ СЧЕТА
{
player1_score = player1_score + 1;
}
else
{
player2_score = player2_score + 1;
}
/* if (player1_score == player2_score)
{
cout <= 10 || player2_score >= 10) // ПРОВЕРКА ОКОНЧАНИЯ ИГРЫ
{
cout << "Игра окончена со счетом: ";
cout << player1_score << ":" << player2_score << endl;
break;
}
}
}
Уроки по ідеї вже повинні бути в порядку від простого до складного. були моменти, але ми ми їх виправили вже. Якщо помітите невідповідність – пишіть.
Код подивлюся пізніше. відпишуся
1. коли пишете “не можу зрозуміти” – потрібно починати з того, що писати чому полягає проблема: НЕ налагоджувати ж за вас весь ваш код?.
2. Крім усього, у вас там ще цілих 2 додаткових проблеми, але вже не програмного, а математичного властивості:
– не можна замість 2-х випадкових величин [1…6] брати 1-но випадкове значення [1…12] – сума 2-х рівномірно розподілених випадкових не має рівномірного розподілу;
– не можна брати rand() % 11 як випадкове значення [0…11] – це у вас молодші цифри випадкового, що не є рівномірним випадковим (і навіть це ваше значення – в діапазоні [0…10], а не [0…11] як потрібно було б).