#
Как сформировать массив случайных чисел в программе на Zig
В данной статье мы рассмотрим ответ на вопрос: как сформировать массив случайных чисел в программе на языке Zig? Этот вопрос последнее время часто мелькает на разных ресурсах в сети интернет, хотя, казалось бы, это простая задача.
В стандартной библиотеке Zig есть пространство имён для генерации случайных чисел std.Random. В нем есть различные типы генераторов псевдослучайных чисел. В данной статье мы рассмотрим генератор типа std.Random.DefaultPrng.
Этот генератор требует инициализации, как и любой другой из стандартной библиотеки Zig. Инициализация происходит, как не трудно догадаться, с помощью функции init.
Если попробовать инициализировать его константой, то вы получите одинаковое псевдослучайное число при каждом запуске.
var rand = std.Random.DefaultPrng.init(0);
std.debug.print("Случайное число: {}\n", .{rand.random().int(u8)});
Вы получите вывод:
Случайное число: 223
Понятно, что если сразу же еще раз вызвать rand.random().int(u8), вы получите следующее число из псевдослучайной последовательности. Но между запусками эти последовательности будут одинаковыми, поскольку точка отсчета для алгоритма остается неизменной константой.
Вывод: нужно внести энтропию (неопределенность) в инициализацию генератора. Самое простое решение — использовать текущее время в миллисекундах.
var rand = std.Random.DefaultPrng.init(@intCast(u64, std.time.milliTimestamp()));
std.debug.print("Случайное число: {}\n", .{rand.random().int(u8)});
Картина будет уже лучше, но для многих чувствительных областей лучше использовать более сложный алгоритм увеличения энтропии. В итоге мы приходим к следующему коду инициализации генератора случайных чисел:
var rand = std.Random.DefaultPrng.init(blk: {
var seed: u64 = undefined;
try std.posix.getrandom(std.mem.asBytes(&seed));
break :blk seed;
});
std.debug.print("Случайное число: {}\n", .{rand.random().int(u8)});
Как результат, разброс полученных чисел будет больше запуск от запуска, чем в случае с использованием текущего времени.
Теперь вернемся к основной теме — формированию массива случайных чисел. В данном случае мы будем формировать массив из 10 случайных чисел типа u8. Например, код может быть таким:
const std = @import("std");
pub fn main() !void {
var prng: std.Random.DefaultPrng = .init(blk: {
var seed: u64 = undefined;
try std.posix.getrandom(std.mem.asBytes(&seed));
break :blk seed;
});
const rand = prng.random();
var randList: [10]u8 = undefined;
for (0..randList.len) |i| {
// Генерация случайного числа типа u8
randList[i] = rand.int(u8);
}
std.debug.print("Случайные числа: {any}\n", .{randList});
}
Конечно же, это лишь один из вариантов. Вы же, базируясь на полученных знаниях, можете придумать множество своих вариантов, дерзайте.
Обсудить можно в наших чатах, адреса которых вы можете найти в разделе «Контакты».