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

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

Про генератор случайных чисел [D6, Win95/98, Win2k]


Демон ©   (2002-07-11 23:45:00) 

Функции Randomize и Rand(x) возвращают из массива от 0 до x случайное значение и впредь его не повторяют...
Вопрос: какая функция также возвращает случайное значение из данного массива, но это значение может повторяться??


Viewer   (2002-07-12 17:25:00) [1]

Кто это решил ?
Ни один программный ГСЧ не выдает неповторяющихся чисел.
По другому они называются датчики псевдослучайных последовательностей (ДСП). Что и означает повторение последовательности с некоторым известным,хотя и большим, периодом. В пределах периода числа выдаются случайным образом, т.е. и повторяющиеся, в том числе.
Проектирование датчика с неповторяющимися значениями в пределах периода - отдельная, да и не слишком востребованная задача.


Malder   (2002-07-12 17:12:00) [2]

Я вас до сиз пор не понял.
С чего вы решили, что Random возвращает НЕПОВТОРЯЮЩИЕСЯ ЧИСЛА ?

вопрос не имеет смысла...


handra   (2002-07-12 16:52:00) [3]

IlyaA > Суммировать значения нельзя, нарушается форма респределения (т.е. числа, находящиеся в середине интервала будут повторяться чаще)
~~~~~~~
Линейный конгруэнтный генератор псевдослучайных чисел (ПСЧ).
Выглядит так: Tn+1 = ((A*Tn) + C) mod M,
где:
A - множитель, такой, что (A mod 4)=1, т.е., например,5,9,13...
С - коэффициент, должен быть нечетным.
М - модуль, должен быть степенью двойки, например, 8,16,32,64...
Т0 - "порождающее число" - может быть любым целым.
Все эти условия должны быть обязательно выполнены. Генератор выдает псевдослучайную последовательность в диапазоне 0..М, причем каждое число встречается только один раз.


Viewer   (2002-07-12 14:50:00) [4]

Что-то вопросы больно темный для твоего заявленного "высшего" образования. Здесь ведь их не дадут.
Поищи опубликованные статьи в Инете:
генерация случайных чисел


AL2002   (2002-07-12 14:07:00) [5]

Удалено модератором


BAY   (2002-07-12 12:33:00) [6]

>>PVOzerski
Точно. Это параметрическая функция с непрерывным равномерным распределением вероятностей (continuous uniform probability distribution. :) RandSeed - параметр этой функции.


Anatoly Podgoretsky   (2002-07-12 12:27:00) [7]

AL2002 © (12.07.02 11:56)
"А кто знает, как "рождаються" случайные числа?"
Пытаешь провести перепись эьиъ людей, интересно конечно.


BAY   (2002-07-12 12:25:00) [8]

>>какая функция также возвращает случайное значение из данного массива, но это значение может повторяться??

Это же компьютер, а не матан. Random может вернуть лишь определенное количество значений (8 байт), а значит значения будут повторяться, вопрос только когда.


PVOzerski   (2002-07-12 12:17:00) [9]

Псевдослучайные числа - на самом деле результат некой математической функции. Что это такое точнее - можно, например, посмотреть в исходниках system.pas (_RandInt, _RandExt).


AL2002   (2002-07-12 11:56:00) [10]

Удалено модератором


Anatoly Podgoretsky   (2002-07-12 11:41:00) [11]

С переписями, поисками и рейтингами в Потрепаться, кроме того если ты хочешь задать свой вопрос, то ты должен делать это в отдельной ветке, при соблюдении этих условий тебе гарантирована почти конфортная жизнь


Anatoly Podgoretsky   (2002-07-12 11:40:00) [12]

AL2002 © (12.07.02 11:29)
Ты хочешь переаись провести?


MBo   (2002-07-12 11:35:00) [13]

>AL2002
Любой, кто в исходники заглянет


AL2002   (2002-07-12 11:29:00) [14]

Удалено модератором


Anatoly Podgoretsky   (2002-07-12 11:23:00) [15]

Извиняюсь, конечно имелось в виду не последовательность, а не повторяющиеся числа


Anatoly Podgoretsky   (2002-07-12 11:21:00) [16]

А зачем так испытывать, проще надо жить for I := 1 to 100 WriteLn(Random(10));создаст неповторяющую последовательность из 100 чисел, каждое из которых не более 9


PVOzerski   (2002-07-12 10:42:00) [17]

А кто сказал, что функция Random(x) обеспечивает последовательность НЕповторяющихся случайных чисел? Никогда такого не слышал и не наблюдал. Угодно пример?

program Project1;
{$apptype console}
var
i:longint;
begin
randomize;
for i:=1 to 10 do
writeln(Random(10));
readln;
end.

На экран вывела у меня сейчас (ясно, что в другой раз результат будет, скорее всего, иным - из-за Randomize):
8
2
2
9
1
1
9
2
7
4
Как видите, значение 2 выскочило 3 раза, значение 1 - 2 раза. IMHO, наоборот, получить последовательность неповторяющихся чисел более сложно.


BAY   (2002-07-12 09:09:00) [18]

По моему Randomize присваивает переменной RandSeed значение таймера. Т.е. для каждого значения RandSeed определена неизменная последовотельность чисел.


IlyaA   (2002-07-12 08:12:00) [19]

Делай сумму 2-х или более Random"ов. Тогда у тебя могут получиться повторные числа


Юрий Зотов   (2002-07-12 00:31:00) [20]

Та же самая Random(x), но СТРОГО без предварительного вызова Randomize.

При каждом запуске программы она будет выдавать ОДНУ И ТУ ЖЕ последовательность случайных чисел в диапазоне 0..x. Это используется, например, при отладке, а после отладки перед первым вызовом Random (только в одном месте!) вставляется Randomize (инициализирует датчик случайных чисел по текущей дате и времени, что и приводит к генерации новой последовательности).

Строго говоря, эти числа всегда ПСЕВДОслучайные, но период их повторения настолько велик, что на практике их можно считать случайными. Распределение - равномерное.


Наверх

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