Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.06 c
1-1119358062
Jolik
2005-06-21 16:47
2005.07.11
Отлов обработанных исключений...


1-1118491492
WST
2005-06-11 16:04
2005.07.11
Сортировка списка


14-1118676013
SPeller
2005-06-13 19:20
2005.07.11
Проблема с IE


1-1118492660
Kolan
2005-06-11 16:24
2005.07.11
AV в dll, объясните в чем может быть причина.


14-1118602142
Kerk
2005-06-12 22:49
2005.07.11
ЦСКА получит Суперкубок просто так





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский