Всем доброго времени суток! Помогите с программным кодам
program loto; const n=90; var i:integer; a:array[1..n] of integer; begin randomize; for i:=1 to 85 do begin a[i]:=random(91); if a[i]<>0 then writeln(' a[',i,']=',a[i]); end; end.
Мне надо чтобы сгенерированные числа не повторялись! Как это сделать??
TarasBer
20.01.2011 18:49
Перемешивание массива делается так:
for i := 1 to MAX do begin j := random(MAX-i+1)+i; // случайный элемент из i..MAX // меняем местами элементы i и j tmp := a[i]; a[i] := a[j]; a[j] := tmp; end;
(может, в ЧАВО добавить, вопрос частый)
Добавлено через 1 мин. А тебе надо сначала заполнить массив числами от 1 до MAX просто последовательно, а потом перемешать массив.
BanneD
20.01.2011 20:11
Цитата(TarasBer @ 20.01.2011 17:49)
Добавлено через 1 мин. А тебе надо сначала заполнить массив числами от 1 до MAX просто последовательно, а потом перемешать массив.
Спасибо большое=) Ну это типа так...
Program loto; Const n=90; Type t=array [1..n] of integer; Var a:t; m,x,i:integer; Begin randomize; for i:=1 to 85 do a[i]:=i; for i:=1 to 85 do write(' a[',i,']=',a[i]); writeln; writeln('---------------------------------------------'); writeln; for i:=1 to n-1 do begin m:=random(n-i-1)+i+1; x:=a[i]; a[i]:=a[m]; a[m]:=x end; for i:=1 to 85 do if a[i]<>0 then write(' a[',i,']=',a[i]); End.
М.б. кому пригодиться
TarasBer
20.01.2011 20:39
m:=random(n-i-1)+i+1;
Неверно.
надо
m:=random(n-i+1)+i;
Должна быть возможность поменять элемент с самим собой (ну оставить на месте). Сам подумай, чтобы при i=1, например, формула превратилась в random(MAX)+1.
А вообще я что-то понять не могу, то у тебя до 90 (в виде константы), то до 85, ты определись.
BanneD
20.01.2011 20:54
Цитата(TarasBer @ 20.01.2011 19:39)
m:=random(n-i-1)+i+1;
Неверно.
надо
m:=random(n-i+1)+i;
Должна быть возможность поменять элемент с самим собой (ну оставить на месте). Сам подумай, чтобы при i=1, например, формула превратилась в random(MAX)+1.
Что то я тебя не понимать=\ задача решается, все верно! Ты так хотел?
for i:=1 to 85 do a[i]:=i; for i:=1 to 85 do write(' a[',i,']=',a[i]); writeln; writeln('---------------------------------------------'); writeln; for i := 1 to 85 do begin m:= random(85-i+1)+i; X:=a[i]; a[i]:=a[m]; a[m]:=x; end; for i:=1 to 85 do if a[i]<>0 then write(' a[',i,']=',a[i]); End.
Цитата
А вообще я что-то понять не могу, то у тебя до 90 (в виде константы), то до 85, ты определись.
Это типа игра=) Ну дали задание в лотореии (в лотке) 90 шаров, из них остаются 5 или 3 шара в лотке а остальные выпадают. Короче это Лото(ты наверно знаешь что это такое=)).
TarasBer
20.01.2011 21:13
> Что то я тебя не понимать=\ задача решается, все верно!
У тебя при i равном n-1 вызывается random(0), тебя не напрягает? Что такое random(0)? Функция, возвращающая число от 0 до -1? Жалко, что в язык не вставлена проверка аргумента для этого случая. Короче, неправильно ты алгоритм мой переписал.
Если трудно, напиши лучше так (всё по процедурам):
function Rand(a, b: integer): integer; // случ. число в a..b begin if a>b then begin WriteLn('Error, invalid argument: ',a, ' ', b); Halt; end else begin Rand := a + random(b-a+1); end; end;
procedure Swap(var a, b: integer); // обмен var tmp: integer; begin tmp := a; a := b; b := tmp; end;
procedure Shuffle(var A: array of integer; L, R: integer); // перемешивает массив, фрагмент от L до R. // Осторожно, внутри процедуры массив нумеруется с нуля, // поэтому желательно и исходный массив нумеровать с 0 // во избежание непоняток! var i: integer; begin for i := L to R do Swap(A[i], A[Rand(i, R)]); // для всех элементов меняем их с любым из тех, что за ними end;
BanneD
20.01.2011 21:20
Цитата(TarasBer @ 20.01.2011 20:13)
> Что то я тебя не понимать=\ задача решается, все верно!
У тебя при i равном n-1 вызывается random(0), тебя не напрягает? Что такое random(0)? Функция, возвращающая число от 0 до -1? Жалко, что в язык не вставлена проверка аргумента для этого случая. Короче, неправильно ты алгоритм мой переписал.
Если трудно, напиши лучше так (всё по процедурам):
я то условие поставил что не выводим ноль! и он все 85 эл-ов массива мне выводит=)
if a[i]<>0 then write(' a[',i,']=',a[i]);
Не ленись проверь мой ПК=) А то что ты с процедурами написал я там нифига не понял так как мы до процедур еще не дошли Ладно не парься. Спасибо за все
TarasBer
20.01.2011 21:23
> я то условие поставил что не выводим ноль!
Это называется костыль. Правильный алгоритм должен работать без костылей.
> А то что ты с процедурами написал я там нифига не понял
Не проходили ещё?
BanneD
20.01.2011 21:24
Цитата(TarasBer @ 20.01.2011 20:23)
> я то условие поставил что не выводим ноль!
Это называется костыль. Правильный алгоритм должен работать без костылей.
> А то что ты с процедурами написал я там нифига не понял
Не проходили ещё?
ага, еще не проходили=)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.