1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
begin randomize; for i:=1to 6do begin loto:=random(49)+1; writeln('Nr.',i:2,loto:6) end end.
В общем эта программа имеет недостаток в том, что не все числа могут выпасть разными. Но не это мне важно! Мне важно узнать о функции "random". Мне не понятно почему "+1"? Для чего "+1"? P.S. Программа из университетского учебника.
Мне тоже очень нравится пример из DRKB, который Sheka привел, очень элегантно. Уже который раз его вижу, и всякий раз восторгаюсь )). Я обычно не вспоминаю его в нужный момент и делаю, как в примере volvo. Но вот сейчас вставил счетчик внутрь repeat, и вышло, что полное количество повторений колеблется примерно от одной тысячи до двух (при диапазоне 256). Конечно, это не значит, что метод DRKB в 6 раз эффективнее (1500/250), ибо в нем используются сдвиги, которые, конечно, значительно медленнее, чем операции с множествами, но все равно здорово )). Особенно, если учесть, что вся процедура производится в начале, а потом лишь чтение значений. Тут тоже есть капля дегтя: памяти идет больше (на данные - в 8 раз)..
Оба метода применимы только для чисел, не превосходящих 255 (и DRKB начинается с 1). Для расширения метода DRKB на больший диапазон нужно реализовать вставление элементов в массив (что несложно), а второй метод потребует практически полной реализации множеств (что, на мой взгляд, сложнее). И еще - на большем диапазоне эффективность второго метода еще упадет (количество повторений увеличится непропорционально). Интересно было бы сравнить, однако..
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
на большем диапазоне эффективность второго метода еще упадет (количество повторений увеличится непропорционально).
Я, похоже, был не совсем прав.. Эффективность действительно падает, но совсем несильно. При диапазоне n=100,000 отношение числа повторений к размеру диапазона равно примерно 11, а при n=1,000,000 оно достигает где-то 13. При n=10,000,000 получается что-то около 16, а дальше я считать не стал - очень долго . Вот прога, если кому интересно. Разумеется, это не для TP )).
const n= 1000000; // диапазон
var s: array[0..n]of integer; i,x,l: LongInt;
begin Randomize; for i:=0 to n do s[i]:=0; l:=0; for i:=1 to n do begin repeat x:= random(n+1); Inc(l) until s[x]=0; s[x]:= 1; end; WriteLn; WriteLn('Repeatitions: ',l); WriteLn('Efficiency: ',(l/n): 3 : 1);
;ReadLn end.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой