PDA

View Full Version : تولید اعداد تصادفی واقعی



SReza1
سه شنبه 13 آبان 1382, 19:08 عصر
با کد زیر متونید اعداد تصادفی واقعی تولید کنید این برنامه با دلفی نوشته شده است ولی الگوریتم اون بسیار واضح است!! برای 64 عدد( میتونید به تعداد دلخواه عوض کنید)


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.

Kambiz
چهارشنبه 14 آبان 1382, 00:49 صبح
فکر کنم منظورت از تصادفی واقعی در حقیقت تصادفی غیر تکراری برای یک بازه مشخص بوده٬ درسته؟

Kambiz
پنج شنبه 15 آبان 1382, 03:14 صبح
در تعریف آرایه‌ها داریم:


Arr1,Arr2 : Array[1..64] of Integer;
از طرفی در کد نوشته شده:


For I := 0 To 64 Do
Arr1[I + 1] := I;
در آخرین دور این حلقه مقدار متغییر I برابر 64 هست و در نتیجه مقدار 64 به خانه 65 از آرایه Arr1 انتساب داده می‌شه٬ یعنی یک خانه بیشتر از حد بالای آرایه!

پیشتر هم یکی از دوستان در بخش دلفی این موضوع رو گوشزد کرده بود.

Mohammad_Mnt
پنج شنبه 15 آبان 1382, 07:19 صبح
آقا من متوجه نشدم این الگوریتم چی کار می کنه که اعداد تصادفی واقعی تولید می کنه ! می شه دلیلش رو هم بگین ؟

SReza1
پنج شنبه 15 آبان 1382, 21:25 عصر
بله!! این در واقع اعداد تصادفی غیر تکراری است!!
من این کد رو کامل اجرا کردم و مشکلی نداشت!! میتونید این ارایه رو یه خونه بزرگ کنید!!! :P
منظور من الگوریتم اونه!! :P :lol:

Mohammad_Mnt
پنج شنبه 15 آبان 1382, 21:52 عصر
می شه دلیلش رو هم بگین ؟
:?:

SReza1
جمعه 16 آبان 1382, 04:48 صبح
محمد جان این بخش کد رو ببین و خط به خط اجرا کن ببین متغییرها چطور جاشون عوض میشه

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;

:oops: :shock:

houshmand
جمعه 16 آبان 1382, 11:53 صبح
Mohammad_Mnt نوشته است:
می شه دلیلش رو هم بگین ؟
فکر کنم منظور سید کاری که این برنامه می کند باشد :lol:

const
max_Arr=64;
var
arr:array [1..max_Arr] of integer;
i:integer;
k,temp:integer;
begin
for i:=1 to max_Arr do
arr[i]:=i;
Randomize;
for i:=1 to max_Arr do
begin
k:=random(max_Arr+1);
//swap arr[i] , arr[k]
temp:=arr[i];
arr[i]:=arr[k];
arr[k]:=temp;
end;
end;
end.

SReza1
جمعه 16 آبان 1382, 18:15 عصر
درسته!! همین روشه! :lol:
اگه طول آرایه من یک دونه زیاد شه درست میشه! :D
بعد اینکه شما یک آرایعه صرفه جویی کردی :D
من بازم میگم!! مهم الگوریتمه تولید اعداد که البته به delphiarea هم گفتم و گفته شد اعداد تصادفی بدون تکرار!! در واقع اعداد رندم دلفی دست کرا میکنه چون اگه قرار باشه تکراری نباشه که دیگه رندم نیست :shock: :twisted:

Kambiz
جمعه 16 آبان 1382, 20:31 عصر
Mohammad_Mnt نوشته است:
می شه دلیلش رو هم بگین ؟
فکر کنم منظور سید کاری که این برنامه می کند باشد :lol:

const
max_Arr=64;
var
arr:array [1..max_Arr] of integer;
i:integer;
k,temp:integer;
begin
for i:=1 to max_Arr do
arr[i]:=i;
Randomize;
for i:=1 to max_Arr do
begin
k:=random(max_Arr+1);
//swap arr[i] , arr[k]
temp:=arr[i];
arr[i]:=arr[k];
arr[k]:=temp;
end;
end;
end.

خط زیر

k:=random(max_Arr+1);
باید بشه

k:=random(max_Arr)+1;

houshmand
جمعه 16 آبان 1382, 23:52 عصر
باید بشه

k:=random(max_Arr)+1;
درست است :D من اول فکر می کردم random بزرگتر از صفر تولید میکند ولی ممکن است صفر هم بشود :lol:

bijibuji
دوشنبه 24 آبان 1389, 03:43 صبح
کسی می تونه تابع رندوم بنویسه بدون استفاده از تایمر (ساعت) کامپیوتر؟