![]()  | 
	
 
  | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код: 
	var
  Form1: TForm1;
  R: Integer;
  New : array [1..15] of Integer;
implementation
{$R *.dfm}
procedure TForm1.RList;
begin
Randomize;
r := Random(15);
if New[r] = 0 then
  RList // ошибка
else
  begin
  ListBox1.Items.Add(IntToStr(r));
  New[r] := 0;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:=1 to 15 do
New[i]:=1;
Edit1.Clear;
for i:=1 to 15 do
RList;
end;Код вялый и выдает ошибку, но после нажатия "ОК" в целом получается то что нужно. Вообще задача состоит в том что есть несколько переменных в которых записаны данные и необходимо что бы эти данные считывались, но в случайном порядке и не повторялись. Возможно кто-то может посоветовать что-то более стабильное. Последний раз редактировалось Kaktuz, 30.11.2011 в 00:13.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Сразу что бросилось в глаза: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	New : array [1..15] of Integer; ... r := Random(15); if New[r] = 0 then ...  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Каково применение сего чуда? 
		
	
		
		
		
		
		
		
			Будь добр, весь код выложи. Или если это весь код, то я могу предложить более простой способ присвоения 15-ти элементам массива значения 0. Ну а если быть серьезным то дописывай: В var Код: 
	fuck: integer; Код: 
	if fuck = 14 then exit; Код: 
	if New[r] = 0 then
  begin
    inc(fuck);
...Да и вобще, какого лешего нужно было писать целую процедуру да и еще потом её саму с себя вызывать для того что бы выполнить одну строчку кода: r := Random(14); ах, да и поправь массивы - это же не серьезно совсем. Последний раз редактировалось m1sclick, 30.11.2011 в 01:42.  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Сори. Забыл пояснить одну деталь. 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	if New[r] = 0 then Если смотреть на код поочередно то можно заметить что в начале было записано в 15 переменных 1 Код: 
	for i:=1 to 15 do New[i]:=1; Если генерированное число (тоисть номер переменной) равняется 1 значит такого числа еще не было и мы его добавим в список и запишем в переменную 0 что это чило уже используется. Ну и так далее. Друго-го я как-то не смог придумать...  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Тогда так: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	r := Random(15) + 1;  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Я вобще-то понял это все, и сути это не меняет совсем. У тебя 15 элементов заполняются нолями и ты тупо продолжаешь открывать процедуры RList пока не заполниш ими всю память. Делай как говорил я или придумывай другой способ как контролировать количество открытых RList. 
		
	
		
		
		
		
		
		
			Во, единственное что я забыл так это обнулять переменную fuck если New[r] <> 0, то есть: Цитата: 
	
 И я до сих пор не понял как строка: Цитата: 
	
 Цитата: 
	
 Как вариант можно вызывать random на 15 и приплюсовывать 1. Последний раз редактировалось m1sclick, 30.11.2011 в 02:14.  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Добавил в свой код только данное действиие, тоесть + 1 и все стало нормально   ![]()  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Уже наверно не актуально но,вот так наверно будет красивее: 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	procedure RList; begin Randomize; repeat r := Random(15)+1; if Form1.ListBox1.Items.Count = 15 then exit; until New[r] <> 0 ; Form1.ListBox1.Items.Add(IntToStr(r)); New[r] := 0; end;  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Почему-то у меня программа зависла с 100% загрузкой процессора. Вот еще так подкорректировал. Код: 
	procedure TForm1.Button2Click(Sender: TObject); var i: integer; begin ListBox1.Clear; for i:=1 to 15 do New[i]:=0; for i:=1 to 15 do ABC; end; procedure TForm1.ABC; var r: integer; begin Randomize; r := random(15)+1; If New[r] = 0 then begin New[r] := r; ListBox1.Items.Add(IntToStr(r)); end else ABC; end; ![]()  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 PHP код: 
	
		
	Последний раз редактировалось Pyro, 30.11.2011 в 06:29.  | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Уже давно существует простой и элегантный способ перемешивания. Создаете массив. Заполняете его значениями по порядку. Затем обмениваете в случайном порядке индексы этого массива. Чем длиннее цикл обмена, тем выше качество перемешивания. Собственно Pyro и показал такой вариант. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#13  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Я что-то не представляю как его использовать... 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#14  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ругается на меня. Что не так? 
		
	
		
		
		
		
		
	
		
		
	
	
	Пишет что Integer и String несовместимые типы. Глобальная переменная "n: integer;" остальные "String;". Код: 
	procedure TForm1.Refresh; var r, a: integer; begin Randomize; r := random(16)+1; if New[r] <> '0' then begin But[n]:=New[r]; a:=But[n]; Box[a]:='0';  | 
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Как определён массив But? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 |