Mt srand: примеры (PHP)
mt_srand(int $seed = 0, int $mode = MT_RAND_MT19937): voidФункция mt_srand() в PHP используется для инициализации генератора псевдослучайных чисел (ГПСЧ) с помощью алгоритма Mersenne Twister. Эта функция задает начальное значение (seed), от которого начинается последовательность случайных чисел. Инициализация позволяет воспроизводить одинаковые последовательности случайных чисел при одинаковом начальном значении, что полезно для отладки или тестирования.
Функция применяется перед использованием функций, зависящих от ГПСЧ, таких как mt_rand(), mt_getrandmax().
- $seed (необязательный, int): Целочисленное значение для инициализации генератора. Начиная с PHP 4.2.0, если параметр опущен, используется случайное значение, основанное на текущем времени и других факторах.
- $mode (необязательный, int): Константа, определяющая, какую реализацию алгоритма использовать. Доступные значения: MT_RAND_MT19937 (использует стандартную реализацию Mersenne Twister) и MT_RAND_PHP (использует устаревший генератор PHP, доступный для обратной совместимости). По умолчанию используется MT_RAND_MT19937.
Использование целочисленного значения для создания воспроизводимой последовательности.
mt_srand(12345);
echo mt_rand() . "\n";
echo mt_rand() . "\n";1622650073 984943658
Автоматический выбор seed на основе текущего времени и системных параметров.
mt_srand();
echo mt_rand(1, 10) . "\n";7
Применение устаревшего генератора для обратной совместимости.
mt_srand(42, MT_RAND_PHP);
echo mt_rand() . "\n";718761528
- srand() — устаревшая функция для инициализации более простого линейного конгруэнтного генератора. Менее качественная случайность по сравнению с Mersenne Twister. Используется только для совместимости со старым кодом.
- random_int() — генерирует криптографически безопасные псевдослучайные целые числа. Не требует предварительной инициализации seed. Рекомендуется для задач, связанных с безопасностью.
- rand() — псевдоним srand()/rand(). Также использует устаревший алгоритм. mt_rand() и mt_srand() предпочтительнее из-за лучшей производительности и качества случайности.
Mt srand в Python
Функция random.seed() модуля random инициализирует ГПСЧ Mersenne Twister, аналогично mt_srand().
import random
random.seed(12345)
print(random.randint(1, 100))
print(random.randint(1, 100))54 96
Mt srand в Javascript
Стандартный Math.random() не позволяет задавать seed. Для контролируемого ГПСЧ используют сторонние библиотеки, например, seedrandom.
// С использованием библиотеки seedrandom
// Пример с импортом библиотеки в Node.js:
// const seedrandom = require('seedrandom');
// let rng = seedrandom('hello');
// console.log(rng());// 0.9282578795792454
Mt srand в MySQL
Функция RAND() может принимать начальное значение как аргумент.
SELECT RAND(42), RAND(42);0.6612013504887822, 0.6612013504887822
Многократный вызов mt_srand() в цикле или при каждом запросе может привести к снижению случайности.
for ($i = 0; $i < 5; $i++) {
mt_srand(123);
echo mt_rand(1, 10) . " ";
}7 7 7 7 7
Если инициализировать генератор значением времени внутри быстрого цикла, можно получить одинаковые seed.
for ($i = 0; $i < 3; $i++) {
mt_srand(time());
usleep(1000); // Небольшая задержка
echo mt_rand() . "\n";
}// Возможно одинаковые значения, если время не изменилось
- В PHP 7.1.0: Функция mt_srand() стала объявлена устаревшей как alias для srand(). Однако это относится только к внутренней реализации, и mt_srand() осталась рекомендуемой для Mersenne Twister.
- В PHP 8.3.0: Добавлен параметр $mode, позволяющий выбирать между MT_RAND_MT19937 и MT_RAND_PHP.
- С PHP 8.2.0: Генерация случайных чисел по умолчанию использует более безопасные источники энтропии, если seed не указан.
mt_srand(100);
$sequence = [];
for ($i = 0; $i < 5; $i++) {
$sequence[] = mt_rand(1, 100);
}
print_r($sequence);
// Повторная инициализация тем же seed
mt_srand(100);
$sequence2 = [];
for ($i = 0; $i < 5; $i++) {
$sequence2[] = mt_rand(1, 100);
}
print_r($sequence2);Array
(
[0] => 86
[1] => 37
[2] => 13
[3] => 63
[4] => 89
)
Array
(
[0] => 86
[1] => 37
[2] => 13
[3] => 63
[4] => 89
)Преобразование строки в целочисленное значение через crc32 для использования в mt_srand.
$seedString = "my seed string";
$seed = crc32($seedString);
mt_srand($seed);
echo mt_rand(1, 1000);478
Использование mt_srand() для создания изолированного контекста генерации чисел.
function createRandomGenerator($seed) {
mt_srand($seed);
return function($min, $max) {
return mt_rand($min, $max);
};
}
$generator1 = createRandomGenerator(555);
$generator2 = createRandomGenerator(555);
echo $generator1(1, 10) . " " . $generator2(1, 10);8 8