ورود

View Full Version : به هم ریختن جدول اعداد



hesamy2004
پنج شنبه 31 خرداد 1386, 18:46 عصر
فرض کنید یه جدول 4*4 داریم که به ترتیب اعداد 1 تا 16 درون آنها نوشته شده است (StringGrid). حالا میخوام با زدن دکمه استارت این اعداده مرتب شده به صورت نامرتب در جدول پخش شوند. پوستم کنده شده ولی نتونستم تا حالا درستش کنم:گریه: . میتونم از تابع رندم استفاده کنم ولی همش اعداده تکراری میده.
لطف کنید و راهنامییم کنید.
با تشکر

SYNDROME
پنج شنبه 31 خرداد 1386, 20:41 عصر
با سلام
دو راه حل پیشنهاد می کنم:
1-می تونی از تابع Random استفاده کنی و یک آرایه 16 خانه ای هم ایجاد کنی و سپس هر عددی که به دست آوردی مقدار را در سلول بریزی و عدد مورد نظر را نیز در آرایه ذخیره کنی و هر باز که عدد به دست آمد با اعداد آرایه چک کن که اگر وجود داشت دویاره عدد را با Random ایجاد کن تا عددی که به شما می دهد در آرایه نباشد.
2- یک StringGrid دیگر در صفحه بگذاری و Visibleآن را False کنی.حالا مقادیر را از StringGridاول بخوان و با همان تابع Random در سلولهای StrignGrid بریز و اگر مقدار آن سلول صفربود یعنی عدد قبلا در آن وجود نداشته پس می توانی بریزی و اگر به غیر از صفر بود یعنی قبلا عدد ریخته ای.در آخر StringGridدوم را در StrignGrid اول کپی کن.

hesamy2004
پنج شنبه 31 خرداد 1386, 22:43 عصر
دوسته من از راهنماییت ممنونم ولی همونطور که خودت میدونی، و من هم تستش کردم این روشها خیلی طولانیه و من میخواستم بدونم آیا تابعی مثله رندم هست که مثلاً برای یه آرایه 4*4 مقادیره غیرتکراری درست بکنه؟ چون استفاده از رندم اعداد تکراری رو هم شامل میشه.
با تشکر

SYNDROME
جمعه 01 تیر 1386, 07:37 صبح
با سلام

دوسته من از راهنماییت ممنونم ولی همونطور که خودت میدونی، و من هم تستش کردم این روشها خیلی طولانیه و من میخواستم بدونم آیا تابعی مثله رندم هست که مثلاً برای یه آرایه 4*4 مقادیره غیرتکراری درست بکنه؟ چون استفاده از رندم اعداد تکراری رو هم شامل میشه.
با تشکر
این دو تا لینک را یک نگاه بکنم.
http://barnamenevis.org/forum/showthread.php?t=68741&highlight=Random
http://barnamenevis.org/forum/showthread.php?t=2841&highlight=Random
انگاری نمی شه یا ما بلد نیستیم.
البته یک راه حل به ذهن من می رسه.
شما می توانید خود قبلا این مقادیر را بسازید و در یک فایل ذخیره کیند .
حالا که می خواهید استفاده کنید به صورت رندوم یک از Recordها را بخوانید.
اگر تعداد رکوردهای شما زیاد باشد احتمال تکرای بودن کم می شود و زمان بر هم نیست.(مثلا 1000 رکود)
این روش در یک بازی خوب جواب می دهد ولی در جاهای دیگر ممکن است خوب نباشد.
البته فقط یک پیشنهاد بود

hesamy2004
جمعه 01 تیر 1386, 13:32 عصر
خب خوشبختانه تونستم با حداقل خط برناممو بنویسم. از SYNDROME هم تشکر میکنم که منو راهنمایی کرد. اگه کد بهتری به نظرتون رسید برام بگید. و اما زیربرنامه من :


procedure TForm1.Init;
label a1;
var I, J, Num : Integer;
N : Array[1..16] of integer;
begin
for I:=1 to 15 do
Numbers[I]:=I;

Num:=1;
for J:=0 to 3 do
for I:=0 to 3 do
begin
SG.Cells[I,J]:=inttostr(Num);
Inc(Num);
end;
SG.Cells[3,3]:='';

Randomize;
for I:=1 to 15 do
begin
a1: J:=Random(30);
if ((J=0) or (J>=16) or(Numbers[J]=17)) then
goto a1;
N[I]:=Numbers[J];
Numbers[J]:=17;
end;

SG.Cells[0,0]:=inttostr(N[1]); SG.Cells[1,0]:=inttostr(N[2]); SG.Cells[2,0]:=inttostr(N[3]); SG.Cells[3,0]:=inttostr(N[4]);
SG.Cells[0,1]:=inttostr(N[5]); SG.Cells[1,1]:=inttostr(N[6]); SG.Cells[2,1]:=inttostr(N[7]); SG.Cells[3,1]:=inttostr(N[8]);
SG.Cells[0,2]:=inttostr(N[9]); SG.Cells[1,2]:=inttostr(N[10]); SG.Cells[2,2]:=inttostr(N[11]); SG.Cells[3,2]:=inttostr(N[12]);
SG.Cells[0,3]:=inttostr(N[13]); SG.Cells[1,3]:=inttostr(N[14]); SG.Cells[2,3]:=inttostr(N[15]); SG.Cells[3,3]:='';

end;

daniel1
دوشنبه 10 دی 1386, 10:16 صبح
سلام بر همه
من زیر کدشما رو نخوندم
چیزی که شما نیاز دارید رندم نیست
یک تابع hash به درد شما می خوره تا باهاش پریش تولید کنید

SYNDROME
دوشنبه 10 دی 1386, 14:41 عصر
سلام بر همه
من زیر کدشما رو نخوندم
چیزی که شما نیاز دارید رندم نیست
یک تابع hash به درد شما می خوره تا باهاش پریش تولید کنید
با احترام
کاربر عزیز به تاریخ آخرین پست نگاه کنید.
برای 6 ماه قبل است.
موفق باشید