HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: c++, генератор случайных чисел, генерация пвседослучайных чисел, гсч, гспч, srand(), rand()</p>
1 <p>Теги: c++, генератор случайных чисел, генерация пвседослучайных чисел, гсч, гспч, srand(), rand()</p>
2 <p>Возможность генерации случайных чисел необходима для работы некоторых программ, например, игр или приложений научно-статистического моделирования. В игре без рандомных событий монстры будут атаковать вас одинаково, вы будете постоянно находить одни и те же артефакты и т. д. Именно поэтому уметь<strong>генерировать случайные числа</strong>- обязанность любого программиста.</p>
2 <p>Возможность генерации случайных чисел необходима для работы некоторых программ, например, игр или приложений научно-статистического моделирования. В игре без рандомных событий монстры будут атаковать вас одинаково, вы будете постоянно находить одни и те же артефакты и т. д. Именно поэтому уметь<strong>генерировать случайные числа</strong>- обязанность любого программиста.</p>
3 <h2>Случайные и псевдослучайные числа. В чём разница?</h2>
3 <h2>Случайные и псевдослучайные числа. В чём разница?</h2>
4 <p>В реальной жизни, чтобы получить случайный результат мы кидаем кости или тасуем колоду карт. Итог будет зависеть от<strong>множества физических переменных</strong>(силы тяжести, трения, сопротивления воздуха, мастерства игрока и т. п.). Во многих смыслах мы действительно<strong>получаем случайный результат</strong>, ведь спрогнозировать его почти невозможно.</p>
4 <p>В реальной жизни, чтобы получить случайный результат мы кидаем кости или тасуем колоду карт. Итог будет зависеть от<strong>множества физических переменных</strong>(силы тяжести, трения, сопротивления воздуха, мастерства игрока и т. п.). Во многих смыслах мы действительно<strong>получаем случайный результат</strong>, ведь спрогнозировать его почти невозможно.</p>
5 <p>У компьютеров всё иначе. Они находятся в<strong>строго контролируемом цифровом мире</strong>, где существуют лишь два значения: правда и ложь. Именно поэтому ПК изначально создан для получения<strong>прогнозируемого результата</strong>. Следовательно, он неспособен генерировать случайные числа в полном смысле этого слова. Однако компьютер может<strong>имитировать случайность</strong>, а достигается это путём использования генераторов псевдослучайных чисел.</p>
5 <p>У компьютеров всё иначе. Они находятся в<strong>строго контролируемом цифровом мире</strong>, где существуют лишь два значения: правда и ложь. Именно поэтому ПК изначально создан для получения<strong>прогнозируемого результата</strong>. Следовательно, он неспособен генерировать случайные числа в полном смысле этого слова. Однако компьютер может<strong>имитировать случайность</strong>, а достигается это путём использования генераторов псевдослучайных чисел.</p>
6 <h2>Что такое генератор случайных чисел?</h2>
6 <h2>Что такое генератор случайных чисел?</h2>
7 <p><strong>Генератор случайных (псевдослучайных) чисел</strong>, он же ГСЧ (<strong>ГСПЧ</strong>) - это программа, принимающая начальное значение и выполняющая с этим значением ряд математических операций, что приводит к конвертации числа в другую цифру, отличную от стартовой. После этого программа применяет новое сгенерированное значение для дальнейших математических операций с последующей генерацией очередного числа, не связанного ни с первым, ни со вторым. И так далее. Таким образом, алгоритм генерирует ряд новых чисел, которые<strong>будут нам казаться действительно случайными</strong>.</p>
7 <p><strong>Генератор случайных (псевдослучайных) чисел</strong>, он же ГСЧ (<strong>ГСПЧ</strong>) - это программа, принимающая начальное значение и выполняющая с этим значением ряд математических операций, что приводит к конвертации числа в другую цифру, отличную от стартовой. После этого программа применяет новое сгенерированное значение для дальнейших математических операций с последующей генерацией очередного числа, не связанного ни с первым, ни со вторым. И так далее. Таким образом, алгоритм генерирует ряд новых чисел, которые<strong>будут нам казаться действительно случайными</strong>.</p>
8 <h2>Простой алгоритм случайных чисел</h2>
8 <h2>Простой алгоритм случайных чисел</h2>
9 <p>Написать простейший генератор случайных чисел несложно. Вот как выглядит программа на C++, которая позволяет генерировать 100 рандомных чисел:</p>
9 <p>Написать простейший генератор случайных чисел несложно. Вот как выглядит программа на C++, которая позволяет генерировать 100 рандомных чисел:</p>
10 #include &lt;iostream&gt; unsigned int PRNG() { // Начальное число - 4 541 static unsigned int seed = 4541; // Берём начальное число и генерируем новое значение // Из-за применения очень больших чисел (и переполнения) угадать следующее число, исходя из предыдущего, довольно сложно seed = (8253729 * seed + 2396403); // Берём начальное число и возвращаем значение в диапазоне от 0 до 32 767 return seed % 32768; } int main() { // Выводим 100 случайных чисел for (int count=0; count &lt; 100; ++count) { std::cout &lt;&lt; PRNG() &lt;&lt; "\t"; // Если вывели 5 чисел, вставляем символ новой строки if ((count+1) % 5 == 0) std::cout &lt;&lt; "\n"; } }<p>А вот результат:</p>
10 #include &lt;iostream&gt; unsigned int PRNG() { // Начальное число - 4 541 static unsigned int seed = 4541; // Берём начальное число и генерируем новое значение // Из-за применения очень больших чисел (и переполнения) угадать следующее число, исходя из предыдущего, довольно сложно seed = (8253729 * seed + 2396403); // Берём начальное число и возвращаем значение в диапазоне от 0 до 32 767 return seed % 32768; } int main() { // Выводим 100 случайных чисел for (int count=0; count &lt; 100; ++count) { std::cout &lt;&lt; PRNG() &lt;&lt; "\t"; // Если вывели 5 чисел, вставляем символ новой строки if ((count+1) % 5 == 0) std::cout &lt;&lt; "\n"; } }<p>А вот результат:</p>
11 <p>Каждое число в этом ряду кажется нам случайным по отношению к предыдущему. Однако, говоря по правде, данный алгоритм достаточно примитивен.</p>
11 <p>Каждое число в этом ряду кажется нам случайным по отношению к предыдущему. Однако, говоря по правде, данный алгоритм достаточно примитивен.</p>
12 <p>Но зачем изобретать велосипед, когда для генерации у нас есть специальные функции?</p>
12 <p>Но зачем изобретать велосипед, когда для генерации у нас есть специальные функции?</p>
13 <h2>Функции srand() и rand()</h2>
13 <h2>Функции srand() и rand()</h2>
14 <p>В языки программирования C и C++ встроены<strong>собственные генераторы случайных чисел</strong>. Реализованы они с помощью двух отдельных функций, которые находятся в заголовочном файле<strong>cstdlib</strong>: 1) srand(). Устанавливает значение, передаваемое пользователем, в качестве стартового. Вызывается лишь 1 раз: в начале программы (как правило, в верхней части функции main());</p>
14 <p>В языки программирования C и C++ встроены<strong>собственные генераторы случайных чисел</strong>. Реализованы они с помощью двух отдельных функций, которые находятся в заголовочном файле<strong>cstdlib</strong>: 1) srand(). Устанавливает значение, передаваемое пользователем, в качестве стартового. Вызывается лишь 1 раз: в начале программы (как правило, в верхней части функции main());</p>
15 <p>2) rand(). Обеспечивает генерацию следующего случайного числа в имеющейся последовательности. Число будет находиться в промежутке от нуля до<strong>RAND_MAX</strong>(это константа в<strong>cstdlib</strong>, значение которой составляет 32 767).</p>
15 <p>2) rand(). Обеспечивает генерацию следующего случайного числа в имеющейся последовательности. Число будет находиться в промежутке от нуля до<strong>RAND_MAX</strong>(это константа в<strong>cstdlib</strong>, значение которой составляет 32 767).</p>
16  
16