Меня беспокоит одна сферическо-вакуумная проблема, выросшая, правда, из вполне реального маленького проекта. А именно <заголовок>.
Я прочитал, что встроенный гсч использует алгоритм вихря мерсена, и по идее должен генерировать равномерно распределенные числа.
Я намутил программу для проверки, которая составляет график распределения, так вот нет никакой равномерности на выходе!
Я использую функцию RandomRange.
Есть ли какой-то другой способ получать 100% равномерно распределенные числа?
Генерация равномерно распределенных случайных чисел
Модератор: Модераторы
Код: Выделить всё
uses
Math;
const
Samples = 1000;
Rows = 15;
var
Buckets: array[0 .. 59] of Cardinal;
Bucket: SizeInt;
Sample, Row: Cardinal;
Max: Cardinal = 0;
begin
FillChar((@Buckets)^, sizeof(Buckets), 0);
writeln('Samples = ', Samples);
for Sample := 1 to Samples do
begin
Bucket := {(RandomRange(0, length(Buckets)) + RandomRange(0, length(Buckets)) + RandomRange(0, length(Buckets)) + 1) div 3} RandomRange(0, length(Buckets));
inc(Buckets[Bucket]);
Max := Math.Max(Max, Buckets[Bucket]);
end;
writeln;
for Row := 1 to Rows do
begin
for Bucket := 0 to High(Buckets) do
if Buckets[Bucket] > Max * (1 - Row/Rows) then
write('#')
else
write(' ');
writeln;
end;
readln;
end.
Да вроде всё нормально.
Последний раз редактировалось runewalsh 17.03.2017 22:43:52, всего редактировалось 2 раза.
Мало чисел беру? Попробую завтра на огромных массивах проверить)
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
https://ru.wikipedia.org/wiki/Тестирование_псевдослучайных_последовательностей
runewalsh писал(а): runewalsh » 17.03.2017 23:31:04
Вы были правы))

