Главная страница
    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.48 MB
Время: 0.047 c
4-1115870523
ORMADA
2005-05-12 08:02
2005.07.11
Созадать иконку (ico) на WinApi


1-1119387638
NightHunter
2005-06-22 01:00
2005.07.11
ЛЮДИ НАДО ПРОСТО ХОВАЙСЯ. HTML документы


6-1112766078
M@Z
2005-04-06 09:41
2005.07.11
NetShareAdd


9-1110377372
mr_Coder
2005-03-09 17:09
2005.07.11
Вопрос новичка по GLScene


14-1118128530
Kerk
2005-06-07 11:15
2005.07.11
Russia Today





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский