Этот рецепт продемонстрирует вам алгоритм, работающий с любым диапазоном ввода и генерирующий новый диапазон, в котором элементы переставлены (“перемешаны”) случайным образом. Алгоритм, в контексте данного рецепта, обозначает нечто такое, что манипулирует диапазонами (т.е практически то же понимание термина “алгоритм”, которое и используется в D) и ни в коем случае не намекает на традиционный смысл понятия “алгоритм”).
Итак, алгоритм randomize перемешивающий входной диапазон:
// randomize algorithm
auto randomize(Range)(Range range)
{
import std.algorithm : remove;
import std.random : Random, uniform, unpredictableSeed;
import std.range : array;
auto _range = range.array;
auto _rng = Random(unpredictableSeed);
struct Result
{
private
{
size_t _index;
}
bool empty()
{
return (_range.length == 0);
}
auto front()
{
return _range[_index];
}
void popFront()
{
_range = _range.remove(_index);
_index = (_range.length > 1) ? uniform(0, _range.length, _rng) : 0;
}
}
return Result();
}
В функции randomize используется классический для D подход в определении диапазонов, а сам код несложен для понимания и реализации.
Связанные по теме рецепты: