Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2015, 12:49   #1
BlowLight
Новичок
Джуниор
 
Регистрация: 21.12.2015
Сообщений: 2
По умолчанию Генератор случайных чисел Pascal/delphi

Требуется написать генератор случайных чисел (pascal, delphi) для квадратного поля (матрицы). При условии, что генерируется по n элем. n типов.
Например, есть поле* 5 x 5, в нём генерируются числа от 1 до 5, численность каждого вида элемента равна пяти. Т.е. поле 5 x 5, пять едениц, пять двоек, пять троек...
BlowLight вне форума Ответить с цитированием
Старый 21.12.2015, 12:54   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

ну и в чём проблем?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 21.12.2015, 13:01   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да, реально, в чём проблема?


если решить в "лоб" (не оптимально), тогда получится такой код:
Код:
Randomize;
{обнулим матрицу)
for i:=1 to N do 
  for j:=1 to N do Matrix[i,j]:=0;

for k:=1 to N do
  for d:=1 to N do begin
    repeat
      i:=Random(N)+1;
      j:=Random(N)+1;
    until Matrix[i,j]=0;
    Matrix[i,j] := d
  end;
решение неэффективное т.к. чем ближе к окончанию, тем больше будет генерироваться случайных координат полей, которые уже заняты.
Для заполнения последних полей, возможно, будет несколько десятков или сотен пустых циклов.

Эффективное решение - заполнить матрицу нужными значениями подряд.
Потом правильно перемешать.
Всё.

Если надо, то могу набросать код.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.12.2015, 13:06   #4
BlowLight
Новичок
Джуниор
 
Регистрация: 21.12.2015
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да, реально, в чём проблема?


если решить в "лоб" (не оптимально), тогда получится такой код:
Код:
Randomize;
{обнулим матрицу)
for i:=1 to N do 
  for j:=1 to N do Matrix[i,j]:=0;

for k:=1 to N do
  for d:=1 to N do begin
    repeat
      i:=Random(N)+1;
      j:=Random(N)+1;
    until Matrix[i,j]=0;
    Matrix[i,j] := d
  end;
решение неэффективное т.к. чем ближе к окончанию, тем больше будет генерироваться случайных координат полей, которые уже заняты.
Для заполнения последних полей, возможно, будет несколько десятков или сотен пустых циклов.

Эффективное решение - заполнить матрицу нужными значениями подряд.
Потом правильно перемешать.
Всё.

Если надо, то могу набросать код.
Набросайте, если не сложно. Заполнение матрицы элементами подряд понятно. Также хотел реализовать перемешивание, однако не вышло.
BlowLight вне форума Ответить с цитированием
Старый 21.12.2015, 13:13   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://www.programmersforum.ru/showthread.php?t=106614
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.12.2015, 14:25   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от BlowLight Посмотреть сообщение
Набросайте, если не сложно. Заполнение матрицы элементами подряд понятно. Также хотел реализовать перемешивание, однако не вышло.
нет проблем.

за основу взял код отсюда - http://www.programmersforum.ru/showp...8&postcount=13

получился такой код:
Код:
const N = 5;
var
 i,j,k,m,buf:integer;
 matrix: array [1..N,1..N] of integer;
begin
 //заполнить
 for i:=1 to N do
   for j:=1 to N do matrix[i,j]:=j;
   
   
 Randomize;
 
 //----------перемешать-------------
 for m:=1 to N*N-1 do
  begin
   k:= Random(N*N-m+1)+m;
   if k<>m then begin
     buf:=matrix[(m-1) div N + 1, (m-1) mod N + 1];
     matrix[(m-1) div N + 1, (m-1) mod N + 1]:=matrix[(k-1) div N + 1, (k-1) mod N + 1];
     matrix[(k-1) div N + 1, (k-1) mod N + 1]:=buf;
   end;
  end;
  
 //-------------вывести-------------
 WriteLn('-------------');
 for i:=1 to N do begin
  for j:=1 to N do  Write(Matrix[i,j]:3);
  WriteLn;
 end
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
генератор случайных чисел с++ Сергей.Ш Общие вопросы C/C++ 18 25.07.2015 22:09
генератор случайных чисел Nicolas_46 Microsoft Office Excel 9 03.12.2012 14:35
Pascal ABC,генератор случайных чисел Aidar9119 Паскаль, Turbo Pascal, PascalABC.NET 2 21.12.2010 16:32
генератор случайных чисел на С++ ANTI Общие вопросы C/C++ 20 12.04.2009 13:02
Генератор случайных чисел psychopat Общие вопросы Delphi 11 18.02.2009 10:39