Обновлено:

Как генерировать число программно

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

Что такое генерация чисел в программе

Компьютер не умеет создавать истинную случайность – он детерминированная машина. Программы используют алгоритмы псевдослучайной генерации (PRNG – Pseudorandom Number Generator), которые вычисляют последовательность чисел, статистически похожую на случайную.

Ключевой параметр алгоритма – seed (начальное значение). При одинаковом seed последовательность повторяется точно. Это полезно для тестирования: можно воспроизвести одинаковые условия. Если seed не задан явно, программа берёт его из системных данных – текущего времени, идентификатора процесса, состояния hardware.

Два типа генераторов:

  • PRNG – псевдослучайные, алгоритмические. Быстрые, достаточны для большинства задач
  • CSPRNG – криптографически стойкие. Непредсказуемы даже при известном seed, необходимы для шифрования и токенов
Настройка генератора
Продвинутые настройки (Seed)
Позволяет получать одинаковую последовательность чисел при каждом запуске.

Как генерировать число в Python

Python предоставляет модуль random для общих задач и secrets для криптографии.

Целое число в диапазоне:

import random
number = random.randint(1, 100)  # от 1 до 100 включительно

Число с плавающей точкой от 0 до 1:

float_num = random.random()  # 0.0 ≤ result < 1.0

Число с плавающей точкой в заданном диапазоне:

float_in_range = random.uniform(10.5, 20.5)

Выбор из списка:

items = ['a', 'b', 'c', 'd']
choice = random.choice(items)

Фиксация seed для повторяемости:

random.seed(42)
print(random.randint(1, 100))  # всегда 74 при seed=42

Для криптографических задач – модуль secrets:

import secrets
token = secrets.randbelow(1000)  # число от 0 до 999, криптографически стойкое

Как генерировать число в JavaScript

В браузере и Node.js доступен Math.random() – возвращает число от 0 (включительно) до 1 (не включительно).

Целое число от min до max:

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
const number = getRandomInt(1, 100);

Число с плавающей точкой в диапазоне:

const floatNum = Math.random() * (max - min) + min;

Math.random() не подходит для криптографии. В браузере используйте crypto.getRandomValues():

const array = new Uint32Array(1);
crypto.getRandomValues(array);
const safeNumber = array[0] % 1000; // от 0 до 999

В Node.js – модуль crypto:

const crypto = require('crypto');
const safeInt = crypto.randomInt(1, 100);

Как генерировать число в C++

Современный C++ (C++11 и выше) использует библиотеку <random> с несколькими алгоритмами генерации.

Простейший пример с Mersenne Twister – наиболее распространённый алгоритм:

#include <random>
#include <iostream>

int main() {
    std::random_device rd;  // источник непредсказуемого seed
    std::mt19937 gen(rd()); // Mersenne Twister, инициализированный random_device
    std::uniform_int_distribution<> dist(1, 100);

    int number = dist(gen);
    std::cout << number << std::endl;
    return 0;
}

Число с плавающей точкой:

std::uniform_real_distribution<> real_dist(0.0, 1.0);
double float_num = real_dist(gen);

Доступные алгоритмы генерации:

  • std::mt19937 – Mersenne Twister, качественное распределение, период 2^19937−1
  • std::minstd_rand – линейный конгруэнтный, быстрый, но менее качественный
  • std::random_device – попытка получить истинно случайное число из OS, может быть недоступна на некоторых платформах

Как генерировать число в Java

Класс java.util.Random – базовый вариант, java.security.SecureRandom – для криптографии.

Целое число в диапазоне:

import java.util.Random;

Random rand = new Random();
int number = rand.nextInt(100) + 1;  // от 1 до 100

Число с плавающей точкой:

double floatNum = rand.nextDouble();  // 0.0 ≤ result < 1.0

SecureRandom для защиты данных:

import java.security.SecureRandom;

SecureRandom secure = new SecureRandom();
int safeNumber = secure.nextInt(1000);

С Java 17+ доступен SplittableRandom – для параллельных вычислений:

SplittableRandom splittable = new SplittableRandom();
int num = splittable.nextInt(1, 101);

Какой генератор чисел выбрать для программы?

Выбор зависит от задачи:

ЗадачаРекомендуемый генераторПричина
Тестирование, моделированиеPRNG (random, Math.random)Скорость, повторяемость при фиксированном seed
Игры, UI-эффектыPRNGДостаточное качество, быстродействие
Генерация паролей, токеновCSPRNG (secrets, crypto)Непредсказуемость для безопасности
Шифрование, SSLCSPRNGКриптографическая стойкость
Параллельные вычисленияSplittableRandom, ThreadLocalRandomНет блокировок между потоками
Научные расчётыMersenne Twister (mt19937)Качественное статистическое распределение

Криптографические задачи требуют специальных генераторов – стандартные PRNG уязвимы для предсказания.

Где применяются генераторы чисел

Случайные числа в программе нужны в десятках сценариев:

  • Тестирование – генерация входных данных для стресс-тестов, fuzzing
  • Моделирование – метод Монте-Карло, стохастические модели в физике и экономике
  • Игры – выпадение предметов, критические удары, уровень врагов
  • Шифрование – создание ключей, nonce, salt
  • Веб – CSRF-токены, session ID, одноразовые коды подтверждения
  • Выборка – случайная выборка из больших данных для анализа
  • Очереди – рандомизация порядка обработки для справедливости

Ограничения псевдослучайных генераторов

PRNG имеют предел качества:

  • Период – последовательность повторяется после N значений. У Mersenne Twister период 2^19937−1, у линейного конгруэнтного – обычно 2^32
  • Корреляция – некоторые алгоритмы показывают зависимости между соседними числами
  • Seed-атака – если seed предсказуем (например, текущая секунда), злоумышленник может воспроизвести последовательность

Для некриптографических задач эти ограничения обычно не критичны. Для защиты данных – используйте только CSPRNG.

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

Часто задаваемые вопросы

Почему программные числа называют псевдослучайными?

Алгоритм генерации использует начальное значение (seed) и формирует последовательность, которая выглядит случайной, но полностью deterministic – при одинаковом seed результат повторяется.

Как задать диапазон при генерации числа?

В большинстве функций нужно указать минимальное и максимальное значение. Например, random.randint(1, 100) в Python вернёт целое число от 1 до 100 включительно.

Можно ли предсказать псевдослучайное число?

Если известно начальное значение seed и алгоритм генератора, последовательность можно воспроизвести полностью. Для криптографии используют специальные генераторы с непредсказуемым seed.

Какой язык программирования проще для генерации чисел?

Python – минимум кода, понятный синтаксис и богатая библиотека random. Для веб-приложений удобен JavaScript с Math.random().

Чем отличается истинно случайное число от псевдослучайного?

Истинно случайные числа получают из физических процессов (радиоактивный распад, шум диода). Псевдослучайные вычисляются алгоритмом и теоретически предсказуемы.

  1. 15 случайных чисел: генератор онлайн и код JavaScript
  2. Random случайные числа онлайн – генератор и примеры
  3. Заполнить случайными числами: онлайн и в коде
  4. Подсчет элементов в строке: символы и подстроки
  5. Рандомный массив: генератор и примеры на JavaScript
  6. Рандомно 2 числа: генерация случайных чисел в JavaScript