Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.03;
Скачать: CL | DM;

Вниз

Раз все предлагают задачи, попробую и я.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
3-6898
Vitamin
2002-05-13 10:45
2002.06.03
получить список таблиц


1-7030
ask
2002-05-21 13:40
2002.06.03
close form -> minimize


14-7205
lipskiy
2002-04-25 23:15
2002.06.03
Вопрос только Питерцам!


3-6896
Z-man
2002-05-13 06:24
2002.06.03
Помогите по


3-6925
Rub
2002-05-14 09:51
2002.06.03
Пытаюсь запихать JPEG в поле binary... Проблемы похоже...