Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Генератор случайных чисел [D7, WinXP]


Ilg ©   (2005-06-21 20:36:00) 

Проблема, наверное, не новая но ответа не нашел...
Мне нужно создать массив случайных не повторяющихся целых чисел.
Поступаю так:
В OnCreate - Randomize;
А при задании массива - a[i]:=random(n) и т. д.
Иногда замечаю, что при генерации массива несколько раз он мало изменяется (если вообще изменяется).
Так можно ли заставить генератор давать более случайные числа (или может я чего не так делаю).
Заранее, Большое спасибо!


TUser   (2005-06-22 10:26:00) [1]

На самом деле, понять что за псевдослучайная величина (с какими свойствами) нужна автору нельзя, не знаю в чем состоит его задача. Если бы он это расписал, то можно было бы сказать, подходит тут борландовский Random или нет.


Rule   (2005-06-22 09:42:00) [2]

Rule ©   (22.06.05 9:40) [15]
в дополнении могу сказать что у чистого рэндом энтропия довольно высокая ... поэтому не советуется использовать в чистом виде а вот с
Юрий Зотов ©   (22.06.05 4:17) [14]
согласен полностью


Rule   (2005-06-22 09:40:00) [3]

Юрий Зотов ©   (22.06.05 4:04) [13]
А понятий "более случайное число" или "менее случайное число" просто не существует

зато существует понятие энтропии, которое и определяет меру случайности ...


Юрий Зотов   (2005-06-22 04:17:00) [4]

> Ilg   (21.06.05 20:36)

Дополнение.

Числа у Вас целые и поэтому повторяться все же могут - например, если их количество больше параметра Random, то повторы точно будут (ясно, что вызывая Random(10), получить более 10 неповторяющихся целых чисел просто невозможно, поэтому если мы сделаем такой вызов 100 раз, то повторы будут обязательно). Можно использовать подход [7], но имейте в виду, что параметр Max должен быть больше параметра Count, иначе будет зацикливание (причем чем Max больше Count, тем "более случайные числа" Вы получите).

Либо, если позволяет задача, используйте вещественные числа. В смысле "случайности" это будет намного точнее.


Юрий Зотов   (2005-06-22 04:04:00) [5]

> Ilg   (21.06.05 20:36)

Если стоит задача только "создать массив случайных неповторяющихся целых чисел", то Вы все делаете верно. Random работает вполне надежно, дает случайные числа, равномерно распределенные на заданном интервале и имеет огромный период повторения, который Вы на практике никогда не достигнете - поэтому неповторение чисел можно считать гарантированнным. А понятий "более случайное число" или "менее случайное число" просто не существует. Мало изменяются числа, или они сильно изменяются - тоже не имеет значения, это все равно будут случайные числа, равномерно распределенные на заданном интервале.


Юрий Зотов   (2005-06-22 03:53:00) [6]

> NightHunter ©   (22.06.05 02:45) [10]

Этот код использует Random и, значит, распределяет как раз по равномерномузакону. Но задачу он вполне решает, поскольку в условии закон не оговаривался.


NightHunter   (2005-06-22 02:46:00) [7]

И, кстати вопрос был в случайном порядке. Проверял продцедура работает


NightHunter   (2005-06-22 02:45:00) [8]

Этот код распределяет по нормальному закону. А зачем по равномерному


Kerk   (2005-06-22 02:04:00) [9]

не надо равномерное с нормальным путать.


NightHunter   (2005-06-22 02:00:00) [10]

Например:
RandomNomer(50,100,A);
В масив A запишется 50 разных чисел от 1 до 100


NightHunter   (2005-06-22 01:59:00) [11]

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 - исходящий масив


ferr   (2005-06-21 21:04:00) [12]

нормальное=гаусовое=колоколообразное
используется в статистике


Rule   (2005-06-21 20:57:00) [13]

Virgo_Style ©   (21.06.05 20:48) [3]
Random, вроде бы, давал все же равномерное распределение.

а равномерное и Гаусовское разве не одно и тоже ?


ferr   (2005-06-21 20:56:00) [14]

Распределение равномерное. Эт точно.

> Virgo_Style ©   (21.06.05 20:48) [3] [Новое
> сообщение][Ответить]

Может автору надо из всего диапозона integer?


Virgo_Style   (2005-06-21 20:48:00) [15]

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 перестановок пар случайных элементов массива.

Писал навскидку, так что ежели что - извиняй =)


TUser   (2005-06-21 20:43:00) [16]

Генераторов можно много написать с разными свойствами. Найди третий том Кнута, выбери нужный тебе алгоритм.


Rule   (2005-06-21 20:39:00) [17]

Ilg   (21.06.05 20:36)
функция random на сколько я помню дает псевдослучайное Гаусовское распределение случайной величины, можно на основании этого закона сделать свою герерацию, тоесть учитывать предыдущее значение, домешать какоето мат преобразование и ещё один случайный параметр ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо