Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
ВнизГенератор случайных чисел Найти похожие ветки
← →
Ilg (2005-06-21 20:36) [0]Проблема, наверное, не новая но ответа не нашел...
Мне нужно создать массив случайных не повторяющихся целых чисел.
Поступаю так:
В OnCreate - Randomize;
А при задании массива - a[i]:=random(n) и т. д.
Иногда замечаю, что при генерации массива несколько раз он мало изменяется (если вообще изменяется).
Так можно ли заставить генератор давать более случайные числа (или может я чего не так делаю).
Заранее, Большое спасибо!
← →
Rule © (2005-06-21 20:39) [1]Ilg (21.06.05 20:36)
функция random на сколько я помню дает псевдослучайное Гаусовское распределение случайной величины, можно на основании этого закона сделать свою герерацию, тоесть учитывать предыдущее значение, домешать какоето мат преобразование и ещё один случайный параметр ...
← →
TUser © (2005-06-21 20:43) [2]Генераторов можно много написать с разными свойствами. Найди третий том Кнута, выбери нужный тебе алгоритм.
← →
Virgo_Style © (2005-06-21 20:48) [3]Random, вроде бы, давал все же равномерное распределение.
Перед первым вызовом Random вызывай Randomize;
Можно сделать так:for i:=low(a) to high(a) do a[i]:=i;
- i-й элемент равен i;
а затемrandomize;
for i:=1 to N do begin //N подбери сам =)
I1:=Random(high(a)-low(a))+low(a);//Случайный индекс массива
I2:=Random(high(a)-low(a))+low(a);//Еще один
tmp:=a[i1];
a[i1]:=a[i2];
a[i2]:=tmp;
end;
- N перестановок пар случайных элементов массива.
Писал навскидку, так что ежели что - извиняй =)
← →
ferr © (2005-06-21 20:56) [4]Распределение равномерное. Эт точно.
> Virgo_Style © (21.06.05 20:48) [3] [Новое
> сообщение][Ответить]
Может автору надо из всего диапозона integer?
← →
Rule © (2005-06-21 20:57) [5]Virgo_Style © (21.06.05 20:48) [3]
Random, вроде бы, давал все же равномерное распределение.
а равномерное и Гаусовское разве не одно и тоже ?
← →
ferr © (2005-06-21 21:04) [6]нормальное=гаусовое=колоколообразное
используется в статистике
← →
NightHunter © (2005-06-22 01:59) [7]procedure RandomNomer(Count:integer;Max:integer;Var Nom:array of integer);
Var
Find:boolean;
i,j:integer;
Begin
Randomize;
for i:=0 to Count-1 do
repeat
Find:=true;
Nom[i]:=random(Max)+1;
for j:=i-1 downto 0 do
if nom[j]=nom[i] then Find:=false;
until find;
end;
Count-сколько чисел,Max - Максимальное, Nom - исходящий масив
← →
NightHunter © (2005-06-22 02:00) [8]Например:
RandomNomer(50,100,A);
В масив A запишется 50 разных чисел от 1 до 100
← →
Kerk © (2005-06-22 02:04) [9]не надо равномерное с нормальным путать.
← →
NightHunter © (2005-06-22 02:45) [10]Этот код распределяет по нормальному закону. А зачем по равномерному
← →
NightHunter © (2005-06-22 02:46) [11]И, кстати вопрос был в случайном порядке. Проверял продцедура работает
← →
Юрий Зотов © (2005-06-22 03:53) [12]> NightHunter © (22.06.05 02:45) [10]
Этот код использует Random и, значит, распределяет как раз по равномерному закону. Но задачу он вполне решает, поскольку в условии закон не оговаривался.
← →
Юрий Зотов © (2005-06-22 04:04) [13]> Ilg (21.06.05 20:36)
Если стоит задача только "создать массив случайных неповторяющихся целых чисел", то Вы все делаете верно. Random работает вполне надежно, дает случайные числа, равномерно распределенные на заданном интервале и имеет огромный период повторения, который Вы на практике никогда не достигнете - поэтому неповторение чисел можно считать гарантированнным. А понятий "более случайное число" или "менее случайное число" просто не существует. Мало изменяются числа, или они сильно изменяются - тоже не имеет значения, это все равно будут случайные числа, равномерно распределенные на заданном интервале.
← →
Юрий Зотов © (2005-06-22 04:17) [14]> Ilg (21.06.05 20:36)
Дополнение.
Числа у Вас целые и поэтому повторяться все же могут - например, если их количество больше параметра Random, то повторы точно будут (ясно, что вызывая Random(10), получить более 10 неповторяющихся целых чисел просто невозможно, поэтому если мы сделаем такой вызов 100 раз, то повторы будут обязательно). Можно использовать подход [7], но имейте в виду, что параметр Max должен быть больше параметра Count, иначе будет зацикливание (причем чем Max больше Count, тем "более случайные числа" Вы получите).
Либо, если позволяет задача, используйте вещественные числа. В смысле "случайности" это будет намного точнее.
← →
Rule © (2005-06-22 09:40) [15]Юрий Зотов © (22.06.05 4:04) [13]
А понятий "более случайное число" или "менее случайное число" просто не существует
зато существует понятие энтропии, которое и определяет меру случайности ...
← →
Rule © (2005-06-22 09:42) [16]Rule © (22.06.05 9:40) [15]
в дополнении могу сказать что у чистого рэндом энтропия довольно высокая ... поэтому не советуется использовать в чистом виде а вот с
Юрий Зотов © (22.06.05 4:17) [14]
согласен полностью
← →
TUser © (2005-06-22 10:26) [17]На самом деле, понять что за псевдослучайная величина (с какими свойствами) нужна автору нельзя, не знаю в чем состоит его задача. Если бы он это расписал, то можно было бы сказать, подходит тут борландовский Random или нет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.047 c