Тасующие генераторы
Тасующие генераторы
И последний тип рассматриваемых нами генераторов, позволяющих получать "более случайные" числа, принадлежит к алгоритмам тасования. Здесь мы опишем генератор, реализованный на основе одного внутреннего генератора, хотя существуют и другие генераторы, аналогичным образом использующие два внутренних генератора.
Как и для аддитивного генератора, на первом этапе создается массив случайных чисел с плавающей запятой. Количество элементов в массиве не имеет особого значения. Кнут (Knuth) предложил использовать длины порядка 100. В нашем примере будет использоваться массив из 97 элементов - простое число, близкое к 100 [11]. (Кстати, применение простого числа не обязательно, оно просто выбрано в качестве примера.) Заполним массив случайными числами, полученными с помощью минимального стандартного генератора случайных чисел. Введем новую вспомогательную переменную и установим ее значение равным следующему случайному числу в последовательности.
При необходимости генерации следующего случайного числа с помощью тасующего генератора, вспомогательная переменная используется для вычисления случайного числа из диапазона от 0 до 96. Устанавливаем значение вспомогательной переменной равным значению элемента с вычисленным индексом и заменяем элемент новым случайным числом, полученным от внутреннего генератора случайных чисел. В качестве результата тасующего генератора используется значение вспомогательной переменной.
Листинг 6.11. Тасующий генератор
type
TtdShuffleGenerator = class(TtdBasePRNG) private
FAux : double;
FPRNG : TtdMinStandardPRNG;
FTable : array [0..96] of double;
protected
procedure sgSetSeed(aValue : longint);
procedure sgInitTable;
public
constructor Create(aSeed : longint);
destructor Destroy; override;
function AsDouble : double; override;
property Seed : longint write sgSetSeed;
end;
constructor TtdShuffleGenerator.Create(aSeed : longint);
begin
inherited Create;
FPRNG := TtdMinStandardPRNG.Create(aSeed);
sgInitTable;
end;
destructor TtdShuffleGenerator.Destroy;
begin
FPRNG.Free;
inherited Destroy;
end;
function TtdShuffleGenerator.AsDouble : double;
var
Inx : integer;
begin
Inx := Trunc(FAux * 97.0);
Result := FTable[Inx];
FAux := Result;
FTable[Inx] := FPRNG.AsDouble;
end;
procedure TtdShuffleGenerator.sgSetSeed(aValue : longint);
begin
FPRNG.Seed := aValue;
sgInitTable;
end;
procedure TtdShuffleGenerator.sgInitTable;
var
i : integer;
begin
for i := 96 downto 0 do
FTable[i] := FPRNG.AsDouble;
FAux := FPRNG.AsDouble;
end;
Принимая во внимание, что приведенный генератор возвращает точно те же случайные числа, что и минимальный стандартный генератор, очень интересно обнаружить, что при проверке его в тестовой программе регулярность не проявляется.
Кроме того, следует отметить, что длина цикла тасующего генератора равна длине цикла внутреннего генератора. Суть тасующего генератора заключается в том, что генерируемые им числа выдаются в другом порядке. Длину цикла можно изменить, если для получения индексов использовать еще один генератор случайных чисел. При этом длина цикла соответственно увеличится. (Та же длина цикла получается при использовании двух внутренних генераторов в комбинированном генераторе.)
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Онлайн-генераторы
Онлайн-генераторы www.csssprites.com. Обладает довольно минималистичным дизайном, есть возможность загружать несколько исходных файлов.www.printf.ru/spritr/. В этом инструменте есть возможность загружать несколько файлов, очень милый дизайн, но в целом настроек мало.spritegen.website-performance.org.
9.2. Генераторы паролей
9.2. Генераторы паролей Генераторы паролей используются для создания особо сложных и длинных паролей. Генераторов паролей – несчетное множество. Каждый школьник, обладая начальными навыками программирования, может создать программу, генерирующую случайную
Генераторы - лучшие друзья первичных ключей
Генераторы - лучшие друзья первичных ключей Надо сказать несколько слов о реализации первичного ключа. Так как он предназначен для обеспечения уникальности, то никакие две записи в одной таблице не могут иметь одинаковых значений этого ключа. То есть, чтобы
Генераторы текстур
Генераторы текстур В состав Filters Unlimites входит несколько генераторов текстур. Подобные эффекты больше всего пригодятся разработчикам трехмерных игр и других 3D-проектов.При помощи фильтров категории Paper Backgrounds (Фон бумаги) можно создать текстуру поверхности любого типа
15.3. Генераторы специализированного кода
15.3. Генераторы специализированного кода Unix имеет давнюю традицию поддержки инструментов, которые специально предназначены для генерации кода для различных специальных целей. Давними "монументами" данной традиции, которые "уходят корнями" в Version 7 и ранние дни Unix, а также
15.3. Генераторы специализированного кода
15.3. Генераторы специализированного кода Unix имеет давнюю традицию поддержки инструментов, которые специально предназначены для генерации кода для различных специальных целей. Давними "монументами" данной традиции, которые "уходят корнями" в Version 7 и ранние дни Unix, а также
Генераторы перестановок (Permutation generators)
Генераторы перестановок (Permutation generators) template ‹class BidirectionalIterator›bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);template ‹class BidirectionalIterator, class Compare›bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);next_permutation берёт последовательность, определённую диапазоном [first, last), и
Аддитивные генераторы
Аддитивные генераторы Второй стандартный метод получения "более случайных" чисел от простого генератора называется аддитивным.В соответствии с этим методом, мы инициализируем массив чисел с плавающей запятой с помощью простого генератора, например, минимального
Генераторы
Генераторы Генераторы являются идеальным средством для создания значений автоинкрементных уникальных ключей или серий значений числового столбца, а также других серий. Генераторы в базе данных объявляются оператором CREATE, как и любой другой объект базы данных:CREATE GENERATOR
Генераторы Adobe Audition
Генераторы Adobe Audition