|
Вопрос # 4 306/ вопрос открыт / |
|
Здарова, эксперты!
Интересует, возможно ли (и как это сделать) заполнить матрицу случайными числами, но так чтобы они не повторялись.
|
Вопрос задал: zloy_nub (статус: Посетитель)
Вопрос отправлен: 10 июня 2010, 18:38
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Amidamaru
Здравствуйте, zloy_nub!
Предлагаю такой способ:
1) матрица пусть 10х10 значит 100 элементов. Пусть макс. величина будет 1000. 1000/100= шаг 10;
2) заполняем матрицу последовательно:
var m:array[1..10,1..10] of integer;
i,j,k,l,b:integer;
begin
randomize;
k:=0;
for i := 1 to 10 do
for j := 1 to 10 do
begin
m[i,j]:=k+random(10);
k:=m[i,j]+1;
end;
3) перемешиваем полученную матрицу случайным образом:
for i := 1 to 10 do
for j := 1 to 10 do
begin
k:=random(9)+1;{+1 потомучто random(x) возвращает случайное число 0 <= random < x}
l:=random(9)+1;
b:=m[i,j];
m[i,j]:=m[k,l];
m[k,l]:=b;
end;
|
Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 10 июня 2010, 19:19
Оценка за ответ: 5
Комментарий к оценке: благодарю... правда я имел ввиду что матрица моет былт размерами от 2х2 до 10х10 и не обязательно даже квадратной... но всё же спасибо!
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 14 июля 2010, 16:31; участников в обсуждении: 4.
|
zloy_nub (статус: Посетитель), 10 июня 2010, 18:40 [#1]:
матрица может быть любой. ну в пределах 10х10 я думаю её сделать
|
|
lx (статус: Посетитель), 10 июня 2010, 18:57 [#2]:
Если ты заполняешь матрицу последовательно, то можно просто сравнивать сгенерированное число со всеми заполненными элементами матрицы и, если такое число уже присутствует, то генерировать новое. Если же матрица заполняется не по порядку (к примеру, ты почему-то не знаешь, какие элементы заполнены, а какие нет), тогда можно ввести вспомогательный массив размера N*M (N,M - размеры матрицы) и хранить в нём уже сгенерированные значения. Вставка осуществляется аналогично первому случаю.
В принципе, можно попытаться придумать какой-нибудь алгоритм для генерации чисел, но для матрицы 10x10 предложенных выше методов вполне хватит.
|
|
zloy_nub (статус: Посетитель), 10 июня 2010, 18:59 [#3]:
можно примерчик для матрицы, которая абсолютно пуста?
|
|
zloy_nub (статус: Посетитель), 10 июня 2010, 19:12 [#4]:
и еще вопрос-просьба... как подсветить (покрасить другим цветом) одну из ячеек матрицы? нужную мне.
|
|
lx (статус: Посетитель), 10 июня 2010, 19:25 [#5]:
Держи:
const
m=5;
n=5;
var
matrix: array [1..m, 1..n] of integer;
tmp: array [1..m*n] of integer;
i, j, k, t: integer;
f: boolean;
begin
randomize;
for i:=1 to m do
for j:=1 to n do
begin
t:=(i-1)*n+j;
f:=true;
while f do
begin
tmp[t]:=random(25);
f:=false;
for k:=1 to t-1 do
if tmp[k]=tmp[t] then
begin
f:=true;
break;
end;
end;
matrix[i,j]:=tmp[t];
end;
for i:=1 to m do
begin
for j:=1 to n do
write(matrix[i,j], ' ');
writeln;
end;
end.
Решение второго вопроса зависит от того, что именно ты используешь для вывода. Если просто выводишь в консоль, то можно использовать функции CRT (или аналогичные на WinAPI). Если как-то по-другому выводишь - тогда и разукрашивать по-другому нужно
|
|
zloy_nub (статус: Посетитель), 10 июня 2010, 19:30 [#6]:
ну вот например матрица в стринг гриде. вот нужный элемент там подсветить и всё) а за алгоритм спасибо))
|
|
zloy_nub (статус: Посетитель), 10 июня 2010, 19:47 [#8]:
это асм?) ну да ладно, поищу. спасибо еще раз...
|
|
Amidamaru (статус: 4-ый класс), 10 июня 2010, 19:49 [#10]:
Цитата:
Комментарий: благодарю... правда я имел ввиду что матрица моет былт размерами от 2х2 до 10х10 и не обязательно даже квадратной... но всё же спасибо! поэтому я и написал "формулу" по которым всё считается. Главное чтобы шаг был не меньше 2, а размер матрицы и макс. величина могут быть любыми.
|
|
ryadom (статус: Посетитель), 14 июля 2010, 16:31 [#11]:
Можно заполнить матрицу последовательными числами, например от 1 до i*j, а потом менять местами случайные ячейки.
Массив будет m*n, которые вводятся с клавиатуры.
var
a:array[1..10,1..10] of integer;
i,j,m,n,t:integer;
begin
readln(m,n);
t:=0;
for i:=1 to m do
for j:=1 to n do
begin
a[i,j]:=t;
t:=t+1;
end;
t:=10;//это число определяет степень распределения чисел по массиву
while t>=0 do
begin
randomize;
a[random(m+1)+1,random(n+1)+1]:=a[random(m+1)+1,random(n+1)+1];
end;
end.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|