PDA

View Full Version : Random



hadavinia
دوشنبه 12 مرداد 1383, 12:12 عصر
کدی بنویسید که عدد 1 تا 6 را به صورت رندوم نشان دهد. :roll:

omidsm
دوشنبه 12 مرداد 1383, 13:33 عصر
اعداد یک تا 6 رو تو یه آرایه ذخیره کن بعد از داخل یه حلقه یک عدد بین یک تا شش رندوم کن و انتقال بده به آخرین خانه آرایه و در دور دوم حلقه یکی از شش کم کن که میشه پنج و همون کارها را برای پنج انجام بده و الی اخر 8)
حالا خودتون کدشو بنویسید :lol: :قهقهه:

JavanSoft
دوشنبه 12 مرداد 1383, 13:39 عصر
Random(5)+1

omidsm
دوشنبه 12 مرداد 1383, 13:46 عصر
Random(5)+1
با این دستور عددی بین 0 تا 6 رندوم انتخاب می شود

hadavinia
دوشنبه 12 مرداد 1383, 14:42 عصر
ممنونم

JavanSoft
دوشنبه 12 مرداد 1383, 14:42 عصر
دوست عزیز Random(5) عددی بین 0 تا 5 را می دهد و حاصل با 1 جمع می گردد

hadavinia
دوشنبه 12 مرداد 1383, 15:04 عصر
میشه کد کاملش رو هم برام بنویسید.

Sepidar
دوشنبه 12 مرداد 1383, 15:33 عصر
چند روز پیش یکی از بچه های همین سایت این سوال رو تو چت ازم پرسید. اینم جواب:


var
produced:set of byte;
i,b:byte;
begin
randomize;
produced:=[];

for i:=1 to 6 do begin
repeat
b:=random(5)+1;
until not(b in produced);
produced:=produced+[b];
writeln(b);
end;

end.

میبخشید که توربو پاسکالی شد!

hadavinia
دوشنبه 12 مرداد 1383, 18:59 عصر
var
produced:set of byte;
i,b:byte;
begin
randomize;
produced:=[];

for i:=1 to 6 do begin
repeat
b:=random(5)+1;
until not(b in produced);
produced:=produced+[b];
writeln(b);
end;

end.
این کد در دلفی عمل نمی کنه. :(

این ارور رو می ده:
I/O error 105

Sepidar
دوشنبه 12 مرداد 1383, 19:18 عصر
اون writeln رو با کد مد نظر عوض کنید.
end آخر هم باید بی نقطه باشد

hadavinia
سه شنبه 13 مرداد 1383, 08:07 صبح
:roll: :roll: :roll: :roll: :roll: :roll: :roll:

وقتی این کارو می کنم برنامه قفل می کنه؟

:roll: :roll: :roll: :roll: :roll: :roll: :roll:

Sepidar
سه شنبه 13 مرداد 1383, 10:40 صبح
به جای

b:=random(5)+1; بنویس:

b:=random(6)+1;
در ضمن پیشنهاد میکنم اندکی هم به منطق برنامه توجه کنی تا اگه یهو ما تو جواب یه سمیکالن جا انداختیم خودت بتونی بذاریش!

فرزاد دلفی باز
شنبه 17 مرداد 1383, 00:00 صبح
برای این کار در OnClick می نویسیم

begin
: i:=0
: Randomize
: (d:=Random(6
: (Label1.Caption:= inttostr(d
: End

که D, i از نوع Integer هستند

Sepidar
شنبه 17 مرداد 1383, 00:07 صبح
برای این کار در OnClick می نویسیم

begin
: i:=0
: Randomize
: (d:=Random(6
: (Label1.Caption:= inttostr(d
: End

که D, i از نوع Integer هستند

با کد شما ممکنه دنباله هایی به شکل زیر هم تولید شود:
2 2 4 1 0 5

یعنی اولا بین 1 و 6 نیست و ثانیا احتمال تکراری بودن اعداد هم وجود دارد!

فرزاد دلفی باز
شنبه 17 مرداد 1383, 00:37 صبح
دوست عزیز Sepidar :
این دنباله بین 0 تا 6 است و در مورد تکراری بودن درسته امکان تکراری بودن وجود داره . شما برای بر طرف کردن مسله تکراری بودن راه حلی دارید ؟ با تشکر ......

omidsm
شنبه 17 مرداد 1383, 09:25 صبح
اینم کد مربوط به مرتب کردن اعداد به صورت رندم بین 1..6
در رویداد onclickبنویسید

var arr:array [1..6] of integer;
i,temp1,temp2:integer;
begin
for i:=1 to 6 do
arr[i]:=i;
randomize;
for i:=5 downto 1 do
begin
temp1:=random(i+1)+1;
temp2:=arr[temp1];
arr[temp1]:=arr[i+1];
arr[i+1]:=temp2;
end; end;
ودر انتها آرایه arr به صورت random مرتب شده است
موفق باشید 8)
(ولی خلا صه این کد و خودم نوشتم :? )

Sepidar
شنبه 17 مرداد 1383, 10:47 صبح
(ولی خلا صه این کد و خودم نوشتم )
این بهترین حالتیه که میتونه اتفاق بیافته. تبریک.


این دنباله بین 0 تا 6 است
دقیقا اینطور نیست. تابع
Random(n) اعداد صحیح تصادفی در بازه باز n وبسته صفر تولید میکند.


ودر انتها آرایه arr به صورت random مرتب شده است
کد شما به واقع از کد من سریعتره. چون کد من به لحاظ تئریک ممکنه اجرا شدنش تا نیم ساعت هم طول بکشه! مخصوصا اگه مثلا وقتی مجبور بشیم 10000 عدد تصادفی غیر تکراری تولید کنیم.
از طرف دیگه یه مشکلی که کد شما داره اینه که اعداد انتهای آرایه احتمال و شانس کمتری نسبت به اعداد ابتدای آرایه برای جابجایی دارند. در واقع هرچه به انتهای آرایه ای که برنامه شما تولید کرده نزدیک میشویم، آرایه مرتبتر خواهد بود!

اما راه حلی که به ذهن حقیر میرسه:


Const
N=10000;
Type
TArr=array [1..N] of word;

Procedure FillRandom(var arr:TArr);

Function FindNthFree(s:word):word;
var
i,b:word;
begin
i:=0;b:=0;

repeat
inc(i);
if arr[i]=0 then inc(b);
until (b=s);

result:=i;
end;

var
i:word;
begin
randomize;
fillchar(arr,sizeof(arr),0);

for i:=N downto 1 do arr[FindNthFree(random(i)+1)]:=i;
end;

مشتاقانه منتظر شنیدن نظرات دوستان هستم :)

SReza1
یک شنبه 18 مرداد 1383, 22:53 عصر
اگه به نگاهی به بخش الگوریتمها میکردید جواب موجود بود


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
Arr1,Arr2 : Array[1..64] of Integer;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
Var I , J , Temp : Integer;
begin
For I := 0 To 64 Do
Arr1[I + 1] := I;
Randomize;
J := 64;
For I := 1 to 64 do
Begin
Temp := Random(J);
Arr2[I] := Arr1[Temp + 1];
Arr1[Temp + 1] := Arr1[j];
Dec(J);
End;
For I := 1 To 64 Do
Listbox1.Items.Add(IntToStr(Arr2[I]));
End;

end.

با این روش 64 تا عدد غیر تکراری دارید :?

MSK
سه شنبه 20 مرداد 1383, 16:34 عصر
begin
for i:=1 to 6 do
begin
b:=random(6)+1;
while [b] in produced do
begin
b:=(b+1) mod 7;
if b=0 then b:=1;
end;
produced:=produced+[b];
end;
end;
که به حلقه های طولانی هم منجر نمی شه :wink:

MSK
سه شنبه 20 مرداد 1383, 16:43 عصر
البته با کمی تغییر می شه به جای مجموعه از آرایه استفاده کرد که یکمی کدش طولانی تر میشه.

جویای نظرات دوستانیم 8-)

Sepidar
سه شنبه 20 مرداد 1383, 23:54 عصر
که به حلقه های طولانی هم منجر نمی شه
این الگوریتم رو تست کردین؟ این فقط یه سری عدد به ترتیب تولید میکنه. مثل 345612



اگه به نگاهی به بخش الگوریتمها میکردید جواب موجود بود
الگوریتم سریع و هوشمندانه ای بود. اما برای ماتریسهای بزرگ فکر کنم الگوریتم دوم من به علت حافظه کمتری که مصرف میکنه بهتر باشه

MSK
چهارشنبه 28 مرداد 1383, 13:32 عصر
اگه شما تست کردید و این طور جواب داده لابد این طوره ولی در این الگوریتم دو عدد متوالی فقط وقتی تولید
میشن که یا حاصل راندوم واقعا متوالی باشه یا منطبق بر عدد قبلی باشه :متفکر:
(هر چند از دلفی نتایج غیر قابل انتظار زیاد دیدم)
نکته دیگه اینه که توی پاسکال راندوم مبتنی بر تایمر سیستم بود (و الان هم فکر کنم همین طوره :?: ) و در
حلقه های منظم و کوتاه جواب های قابل پیشبینی می داد(شاید الان هم همین طور باشه :?: ) .
در هر صورت من توی الگوریتمش مشکلی نمی بینم اگه شما اشکالی می بینید بسیار ازتون ممنون می شم
که به ما هم بگید :|