Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 306

/ вопрос открыт /

Здарова, эксперты!
Интересует, возможно ли (и как это сделать) заполнить матрицу случайными числами, но так чтобы они не повторялись.

zloy_nub Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

zloy_nub (статус: Посетитель), 10 июня 2010, 18:40 [#1]:

матрица может быть любой. ну в пределах 10х10 я думаю её сделать
lx

lx (статус: Посетитель), 10 июня 2010, 18:57 [#2]:

Если ты заполняешь матрицу последовательно, то можно просто сравнивать сгенерированное число со всеми заполненными элементами матрицы и, если такое число уже присутствует, то генерировать новое. Если же матрица заполняется не по порядку (к примеру, ты почему-то не знаешь, какие элементы заполнены, а какие нет), тогда можно ввести вспомогательный массив размера N*M (N,M - размеры матрицы) и хранить в нём уже сгенерированные значения. Вставка осуществляется аналогично первому случаю.
В принципе, можно попытаться придумать какой-нибудь алгоритм для генерации чисел, но для матрицы 10x10 предложенных выше методов вполне хватит.
zloy_nub

zloy_nub (статус: Посетитель), 10 июня 2010, 18:59 [#3]:

можно примерчик для матрицы, которая абсолютно пуста?
zloy_nub

zloy_nub (статус: Посетитель), 10 июня 2010, 19:12 [#4]:

и еще вопрос-просьба... как подсветить (покрасить другим цветом) одну из ячеек матрицы? нужную мне.
lx

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

zloy_nub (статус: Посетитель), 10 июня 2010, 19:30 [#6]:

ну вот например матрица в стринг гриде. вот нужный элемент там подсветить и всё) а за алгоритм спасибо))
lx

lx (статус: Посетитель), 10 июня 2010, 19:43 [#7]:

Со StringGrid вряд ли помогу. Можно поискать в интернете, наверняка уже обсуждалось. Тут, к примеру http://www.wasm.ru/forum/viewtopic.php?id=25141
zloy_nub

zloy_nub (статус: Посетитель), 10 июня 2010, 19:47 [#8]:

это асм?) ну да ладно, поищу. спасибо еще раз...
lx

lx (статус: Посетитель), 10 июня 2010, 19:49 [#9]:

Это C++ ;) Но там всё совершенно понятно, так что удачи ;)
Amidamaru

Amidamaru (статус: 4-ый класс), 10 июня 2010, 19:49 [#10]:

Цитата:

Комментарий: благодарю... правда я имел ввиду что матрица моет былт размерами от 2х2 до 10х10 и не обязательно даже квадратной... но всё же спасибо!
поэтому я и написал "формулу" по которым всё считается. Главное чтобы шаг был не меньше 2, а размер матрицы и макс. величина могут быть любыми.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
ryadom

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.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 16:47
Выполнено за 0.03 сек.