Форум: "Потрепаться";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
ВнизРаз все предлагают задачи, попробую и я. Найти похожие ветки
← →
blackweber (2002-04-23 21:25) [0]Заполнить массив из N элементов не повторяющимися числами от 1 до N.
У меня что-то не получается:
var a:array[1..24] of integer;
z,x,c:integer;
begin
randomize;
repeat
inc(z);
x:=random(36);
a[z]:=x;
for c:=1 to z do
begin
if a[c]=x then z:=c;
end;
writeln(z," ",a[z]);
until z>23;
readln;
end.
← →
Doom (2002-04-23 21:32) [1]Такая задачка уже была в основной конфе неделю назад
Только там от 1 до 10 числа были но разница небольшая
← →
UDS (2002-04-23 21:33) [2]RANDOMIZE;
FOR I:=1 TO 7 DO
A[I]:=I; // создаем массив и заполняем его
// числами от 1 до 7 по порядку
Точно это я вопрос задавал. Иответ был генитально прост:
For i := 1 To 7 do begin // для каждой ячейки массива
j := a[i]; // делаем переменную j равной
// значению в этой ячейке
t := Random(7)+1; // переменной t присваиваем
// cлуч. число от 1 до 7
a[i] := a[t]; a[t] := j; // затем этой ячейке присваивается
end; // значение ячейки с номером t,
// а ячейке с номером t, то чему равна j.
← →
Oleg_Gashev (2002-04-23 21:42) [3]Xi+1 = (Xi + a) mod n,
где HOD(a,n)=1
← →
blackweber (2002-04-23 22:54) [4]>Oleg_Gashev
Может я чего-то не понял, но надо случайными числами.
← →
VuDZ (2002-04-23 23:03) [5]
int n = 10;
int ar[10];
int temp = 0;
for (int i = 0; i < n; ++i){
temp = rand() % n;
for (int j = 0; j < i; ++j)
if (ar[j] == temp)
break;
j == i ? ar[i] = temp : i--;
}
← →
blackweber (2002-04-23 23:34) [6]>VuDZ
Лучше на Delphi, а то Ц вообще только на интуитивном уровне.
← →
VuDZ (2002-04-23 23:55) [7]а там ничего сложношл и нет:
1. выбераем случайное число от 0 до N
2. просматриваем массив от 0 до текущего значения i в поисках данного числа
3. если его нет, то добавляем, иначе уменьшаем счётчик цмкла на 1, и продолжаем пок ане наступит полная фиеста :>
← →
Di_wind (2002-04-24 00:46) [8]2 VuDZ ага и если числа от 1 до 100, и у тебя останется не найдено,к примеру 66, то рандом(100) будет эти 66 будет с таким тормозом искать....
← →
VuDZ (2002-04-24 01:04) [9]ну и что? :>
можно сделать проще - список с числами длинной в N. Выбераем случайное число i. Если i > N, берём последнее число. А использованный элемент удаляем, т.к. у нас список типа такого:
struct _Node{
int nValue;
_Node * next;
}
и всё заполниться за N проходов... только код получитьс больше
← →
MBo (2002-04-24 06:31) [10]randomize;
for i:=1 to n do
list.add(pointer(i));
for i:=1 to n do begin
j:=random(list.count);
a[i]:=integer(list[j]);
list.delete(j);
end;
реализация этого принципа может быть и другой.
без использования доп. структур - заполняем массив, потом делаем
порядка n перестановок элементов на случайных местах.
← →
VictorT (2002-04-24 11:42) [11]
> blackweber © (23.04.02 21:25)
Заведи себе привычку выделять отступами структуру программы, а то потом самому в своих исходниках трудно разобратся будет.
← →
blackweber (2002-04-24 21:26) [12]> VictorT
Я имею такую привычку, но здесь не поддерживается выделение ((((
Спасибо всем, разобрался:
uses crt;
var a:array[1..24] of integer;
z,x,y:integer;
begin
clrscr;
randomize;
for z:=1 to 24 do a[z]:=z;
for z:=1 to 24 do begin
x:=a[z];
y:=random(24)+1; // Не понимаю почему если 1 не прибавить
a[z]:=a[y]; // получаем ерунду. Да и что-то не догоняю
a[y]:=x; // почему в результате таких махинаций числа
end; // в массиве дейсвительно не совпадают?
for z:=1 to 24 do writeln(a[z]);
readln;
end.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c