C и C++ имеют свои собственные встроенные генераторы случайных чисел. Они реализованы в двух отдельных функциях, которые находятся в заголовочном файле
cstdlib
:srand()
устанавливает передаваемое пользователем значение в качестве стартового. srand()
следует вызывать только один раз — в начале программы (обычно в верхней части функции main()
)rand()
генерирует следующее случайное число в последовательности. Оно будет находиться в диапазоне от 0
до RAND_MAX
(константа в cstdlib
, значением которой является 32767
).Вот пример программы, в которой используются обе эти функции:
#include <iostream>
#include <cstdlib> // для функций rand() и srand()
int main()
{
srand(4541); // устанавливаем стартовое значение - 4 541
// Выводим 100 случайных чисел
for (int count=0; count < 100; ++count)
{
std::cout << rand() << "\t";
// Если вывели 5 чисел, то вставляем символ новой строки
if ((count+1) % 5 == 0)
std::cout << "\n";
}
}
// 14867 24680 8872 25432 21865
// ...
В C++ 11 добавили тонну нового функционала для генерации случайных чисел, включая алгоритм Вихрь Мерсенна, а также разные виды генераторов случайных чисел (например, равномерные, генератор Poisson и пр.). Доступ к ним осуществляется через подключение заголовочного файла
random
. Вот пример генерации случайных чисел в C++11 с использованием Вихря Мерсенна на картинке.
Вихрь Мерсенна генерирует случайные 32-битные целые числа
unsigned
(а не 15-битные целые числа, как в случае с rand()
), что позволяет использовать гораздо больший диапазон значений. Существует также версия (
std::mt19937_64
) для генерации 64-битных целых чисел unsigned
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
std::istream::eof()
- это признак плохого кода и что в частности неправильно писать:while (!input_stream.eof()) {
input_stream >> value;
process(value);
}
Что в этом коде не так? Как писать правильно?
std::istream::eof()
в том, что он выставляется только после выполнения какой-либо операции чтения. Поэтому происходит следующее:std::ifstream input_stream("empty_file.txt"); // Открываем пустой файл
if (!input_stream.eof()) { // eof() == false, т.к. мы еще ничего не читали
int value;
input_stream >> value; // Пытаемся читать число, а его там нет.
// Здесь eof() == true, но мы это не проверяем.
std::cout << value; // Выведется 0.
}
Так что если и вызывать
eof()
, то это надо делать после операции чтения.std::istream
умеют преобразовываться в bool
, а каждая операция чтения возвращает ссылку на std::istream
. Поэтому идиоматичный код выглядит следующим образом:while (input_stream >> value) {
process(value);
}
std::string str;
while (std::getline(input_stream, str)) { ... }
while (input_stream >> value1 >> value2) { ... }
Здесь если при чтении
value1
произойдет ошибка, то все последующие операции чтения (т.е. value2
) будут игнорироваться, по этому можно читать сразу несколько значений сразу, и уже потом проверять состояние std::istream
.@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
C и C++ имеют свои собственные встроенные генераторы случайных чисел. Они реализованы в двух отдельных функциях, которые находятся в заголовочном файле
cstdlib
:srand()
устанавливает передаваемое пользователем значение в качестве стартового. srand()
следует вызывать только один раз — в начале программы (обычно в верхней части функции main()
)rand()
генерирует следующее случайное число в последовательности. Оно будет находиться в диапазоне от 0
до RAND_MAX
(константа в cstdlib
, значением которой является 32767
).Вот пример программы, в которой используются обе эти функции:
#include <iostream>
#include <cstdlib> // для функций rand() и srand()
int main()
{
srand(4541); // устанавливаем стартовое значение - 4 541
// Выводим 100 случайных чисел
for (int count=0; count < 100; ++count)
{
std::cout << rand() << "\t";
// Если вывели 5 чисел, то вставляем символ новой строки
if ((count+1) % 5 == 0)
std::cout << "\n";
}
}
// 14867 24680 8872 25432 21865
// ...
В C++ 11 добавили тонну нового функционала для генерации случайных чисел, включая алгоритм Вихрь Мерсенна, а также разные виды генераторов случайных чисел (например, равномерные, генератор Poisson и пр.). Доступ к ним осуществляется через подключение заголовочного файла
random
. Вот пример генерации случайных чисел в C++11 с использованием Вихря Мерсенна на картинке.
Вихрь Мерсенна генерирует случайные 32-битные целые числа
unsigned
(а не 15-битные целые числа, как в случае с rand()
), что позволяет использовать гораздо больший диапазон значений. Существует также версия (
std::mt19937_64
) для генерации 64-битных целых чисел unsigned
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
acpp -o test -O3 test.cpp
позволяет создать бинарный файл, который будет работать на GPU от Intel, NVIDIA и AMD, что делает AdaptiveCpp единственным в мире компилятором SYCL, способным генерировать такие универсальные исполняемые файлы.AdaptiveCpp 24.02 также предлагает кэширование ядер на диске, автоматическую специализацию ядер во время выполнения и другие улучшения.
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Полезная статья о том, что с C++ нужно быть поаккуратнее.
В статье освещается множество важных нюансов, в частности:
#define
free
delete
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
При использовании в C++ кода
while(!file.eof())
{
// Чтение из файла
}
получаются неприятности - лишняя считанная строка, например. Почему? Как правильно проверить, что достигнут конец файла?
В чём дело?
Лучше для этого использовать цикл
for
и в заголовке выполнять само чтение с проверкой:for(int n; file >> n; )
{
// Обработка считанного значения n
}
if (file.bad())
std::cout << "Ошибка ввода-вывода при чтении\n";
else if (file.eof())
std::cout << "Достигнут конец файла\n";
else if (file.fail())
std::cout << "Неверный формат данных\n";
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Это открытый проект парсера на базе LLVM/Clang для проверки кода C и C++ на предмет оценки его пригодности для работы внутри транспортных механизмов (автомобилей и прочего) и других критически важных для безопасности технических сред в рамках соответствия требованиям стандарта AUTOSAR (AUTOmotive Open System ARchitecture) C++14.
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
#include "include/cef_app.h"
int main(int argc, char* argv[]) {
CefMainArgs main_args(argc, argv);
CefSettings settings;
// выполняем инициализацию
CefInitialize(main_args, settings, nullptr, nullptr);
// создаем окно с UI
CefWindowInfo window_info;
CefBrowserHost::CreateBrowser(window_info, new SimpleHandler(), "file:///your_ui.html", CefBrowserSettings(), nullptr);
// цикл обработки сообщений
CefRunMessageLoop();
// Cef для окончания работы
CefShutdown();
}
Замените
"file:///your_ui.html"
на путь к вашему HTML-файлу. Вуаля! Ваш интерфейс на HTML/CSS уже встроен в приложение на C++.@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Organic Maps призывает всех желающих принять участие в ежегодной программе Google Summer of Code 2024 (GSoC), в рамках которой контрибьюторы со всего мира участвуют в разработке программного обеспечения с открытым исходным кодом под руководством опытных наставников из различных организаций.
Участвуйте в GSoC, пробуйте свои силы)
(большая часть проекта на C++, 76.1%)
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Обсуждаются типы данных в C++, для которых не нужна дополнительная синхронизация при конкуретном доступе.
Параллельно спикер рассказывает, как С++ помогает тонко оптимизировать lock-free разработку с помощью memory ordering.
Рекомендую, затрагивается много полезных для понимания вещей
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Цель C++ Insights - сделать видимыми вещи, которые обычно происходят за кулисами. Речь идет о волшебстве, которое компилятор совершает для нас, чтобы заставить все работать.
▪Github
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Вот некоторые из обсуждаемых тем:
• Множественное и виртуальное наследование
• Идентификация типов во время выполнения
• Определение шаблона функции
• Абстрактные контейнерные типы
• Перегрузка операторов
• Область видимости и время жизни
• Инициализация, присваивание и уничтожение класса
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM