PDA

View Full Version : اشکال در برنامه نویسی عدد تصادفی



mnakhaei67
چهارشنبه 06 مهر 1390, 11:09 صبح
باسلام.اگر در یک فیلد از دیبی گریدی اعدادی که ذخیره میشوند به صورت رنجی باشند یعنی به صورت مثلا 1-3 باشند ما چگونه میتوانیم برنامه ای بنویسیم که بشه یک عدد مثلا 2.25 به عنوان رندوم نشون داده بشه؟با تشکر

MohsenB
چهارشنبه 06 مهر 1390, 12:15 عصر
سلام

این کد یه راهشه :


var i :Single;
begin
Randomize;
repeat
i:= Random * 10;
until ((i<=3)and(i>=1));

موفق باشید

mnakhaei67
چهارشنبه 06 مهر 1390, 12:40 عصر
باسلام و تشکر.میشه بگید i:=random*10 یعنی چه؟و در ضمن برنامه باید به گونه ای نوشته شود که برای هر رنجی جواب دهد اما اهرا برنامه شما تنها برای رنج مثال زده شده جواب میدهد.

MohsenB
چهارشنبه 06 مهر 1390, 13:23 عصر
سلام

این خط با ارزشترین رقم اعشار رو به قبل از اعشار میبره .

خوب این فکر کنم کارتونو راه بندازه :


uses Math;

function MyRandom(min, max: Single):Single;
var i ,z :Single;
begin
Randomize;
z:= Power(10,Length(IntToStr(Floor(max))));
repeat
i:= Random * z;
until ((i<=max)and(i>=min));
Result:= i;
end;


ویا خیلی ساده با این کد . البته با اعداد صحیح :


uses Math;

function MyRandom(min, max: Integer):Integer;
begin
Randomize;
Result:= Random(max-min) + min;
end;
موفق باشید

firststep
چهارشنبه 06 مهر 1390, 17:55 عصر
سلام
دستور Randomize;
باعث میشه که یک عدد تصادفی(بین 0 تا 1) درون random ریخته میشه حالا زمانی که شما از او خط کد استفاده می کنین i:= Random * 10; باعث میشه انقدر اعداد بعد از صفر به سمت پشت اعشار برن که از کوچکترین ، بزرگتر و از بزرگترین عددتون کوچکتر باشه
که این کدی نسبتاٌ درستی هستش
1
2
3
4
5
6
7
8
9
10
11
12
uses Math;

function MyRandom(min, max: Single):Single;
var i ,z :Single;
begin
Randomize;
z:= Power(10,Length(IntToStr(Floor(max))));
repeat
i:= Random * z;
until ((i<=max)and(i>=min));
Result:= i;
end;
توی این کد تعداد ارقام max برگشت داده میشه و در random ضرب میشه این به این خاطره که سزیعتر به جواب برسیم

mnakhaei67
شنبه 09 مهر 1390, 10:49 صبح
ضمن عرض سلام و تشکرخدمت شما توی این فایل هایی که به همراه فایل اجرایی برنامه ای که اپلود کردم یه فایل هست که پسوند اون BAS. است،اگه اون رو با NotePad باز کنید سورس همون برنامه به زبان VB (بیسیک) است.میشه اون رو برام به دلفی تبدیل کنید؟ممنون میشم
76092

mnakhaei67
یک شنبه 10 مهر 1390, 11:16 صبح
باسلام و خسته نباشید.من برنامه زیر رو نوشتم میشه بگید اشکالش از کجاست؟
c:=length(a:string):integer; d:=pos(a,'-'); b:=copy(a,0,d); e:=copy(a,d+1,c-d);
درضمن چگونه میتونم برای هر رکورد از جدولم برنامه ای بنویسم که براساس فیلد f_randomdigits عددی به تصادف انتخاب کند؟خواهش میکنم منو زود راهنمایی فرمایید
توجه:اعداد در این فیلد به صورت 1-3 برای مثال درج میشوند
باتشکرفراوان

firststep
یک شنبه 10 مهر 1390, 16:07 عصر
var
e,b,a:string;
d,c: Integer ;
begin
a:=edt1.Text;
d:=Pos('-',a);
b:=copy(a,0,d-1);
e:=Copy(a,d+1,c-d);
edt2.Text:=e;
edt3.Text:=b;
end;

SAASTN
یک شنبه 10 مهر 1390, 21:35 عصر
برای ایجاد یه عدد تصادفی در یک رنج مشخص نیازی به حلقه وجود نداره. اگر رنج و خروجی تابع اعداد صحیح باشن تابع RandomRange که توی Math تعریف شده، این کار رو انجام میده، و اگه بازه و خروجی مقادیر اعشاری باشن:
function FloatRandomRange(const AFrom, ATo: Double): Double;
begin
if AFrom > ATo then
Result := Random * (AFrom - ATo) + ATo
else
Result := Random * (ATo - AFrom) + AFrom;
end;



توی این فایل هایی که به همراه فایل اجرایی برنامه ای که اپلود کردم یه فایل هست که پسوند اون BAS. است،اگه اون رو با NotePad باز کنید سورس همون برنامه به زبان VB (بیسیک) است.میشه اون رو برام به دلفی تبدیل کنید؟
اون تابع بیسیک یک تعداد مشخص از اعداد تصادفی صحیح و واقع در یه بازه رو بر می گردونه، برای همین دنگ و فنگ اضافی داره که لازم نیست. همون کد بالا کار شما رو انجام میده.

mnakhaei67
دوشنبه 11 مهر 1390, 10:12 صبح
ضمن عرض سلام و تشکر میخواستم بدونم چرا وقتی برنامه شما رو مینویسم و اون کد ساده(کد دومی)که آقای mohsenB فرمودن مینویسم جواب اشتباه به دست می آید؟و دوم اینکه برای اینکه با هربار کلیک روی دکمه موجود در فرم عدد تصادفی متفاوتی به دست آید چه باید کرد؟باسپاس

MohsenB
دوشنبه 11 مهر 1390, 12:02 عصر
ضمن عرض سلام و تشکر میخواستم بدونم چرا وقتی برنامه شما رو مینویسم و اون کد ساده(کد دومی)که آقای mohsenB فرمودن مینویسم جواب اشتباه به دست می آید؟

احتمالا اعداد بیشترین و کمترین رو اشتباه وارد میکنید .

mnakhaei67
دوشنبه 11 مهر 1390, 12:38 عصر
باتشکر.من یه تکه از برنامه رو که مربوط به تولید min و max میباشد ضمیمه میکنم اینجا لطفا به من بگید بقیه راه را چگونه برم باتوجه به سوالی که قبلا کردم.قبلا از راهنمایی و توجه شما سپاسگذارم76172

mnakhaei67
دوشنبه 11 مهر 1390, 12:43 عصر
ببخشید یادم رفت دیتابیسشو بفرستم این هم دیتا بیس
76173

mnakhaei67
شنبه 16 مهر 1390, 10:09 صبح
باسلام.من برنامه ای به کمک دوستان نوشتم اما حالا یه سوال دیگه دارم اگه خواسته باشم عدد تصادفی از بین اولین عدد در اولین رکورد(یعنی اگه عدد در اولین رکورد به صورت 1-3 بود عدد1 منظور من است یعنی عدد قبل از "-")و آخرین عدد از آخرین رکورد(یعنی اگه عدد در آخرین رکورد به صورت 7-10 بود عدد 10 منظور من است یعنی عدد بعد از "-")انتخاب بشه چه کدی باید بنویسم؟:متفکر:من کد زیر رو نوشتم اما این کد عدد تصادفی در هر رکورد را جدا حسای میکنه.ممنون از راهنمایی های شما عزیزان

procedure TForm1Initialize(Sender:TObject);
begin
Randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
e,b,a:string;
d,c,f,w,i: Integer ;
x:integer;
begin

a:=form2.ADOTable1.FieldValues['f_randomdigits'];
d:=Pos('-',a);
b:=copy(a,0,d-1);
e:=Copy(a,d+1,c-d);
edit1.Text:=b;
edit2.Text:=e;
f:=strtoint(b);
w:=strtoint(e);
Randomize;
x:=RandomRange(w,f);
label3.Caption:=inttostr(x);
form2.ADOTable1.Next;
end;

firststep
شنبه 16 مهر 1390, 14:00 عصر
سلام
خوب ببینید می تونین دوتا تابع مشخص کنین که یکی قصمت سمت چپ علامت '- ' (min)
FUNCTION LEFTDASH(STR:STRING):Integer;
var
D:Integer;
B:string;
E:string;
begin
D:=Pos('-',STR);
E:=Copy(STR,0,D-1);
Result:=STRTOINT(E);
end;

و دیگر سمت راست علامت '-' که به عنوان max هست را محاسبه نماید


FUNCTION RIGHTDASH(STR:STRING):Integer;
var
C,D:Integer;
E:string;
begin
C:=Length(STR);
D:=Pos('-',STR);
E:=Copy(STR,D+1,C-D);
RIGHTDASH:=STRTOINT(E);
end;


و بعد برای مثال درون هر جایی که موخواین اون مقدار رو از اولین رکرود جدول بگیرین و درون این تابع(leftdash) قرار هید تا min برداشت شود وبعد به اخرین رکورد رفته و مقدار مورد نظر را درون rightdash قرار دهید تا max برداشت شود و سپس به وسیله تابع rondom عدد تصادفی موردن نظر را محاسبه نمایید

mnakhaei67
دوشنبه 18 مهر 1390, 11:50 صبح
سلام.برای اشکالی که در بالا مطرح کردم کد زیر چه اشکالی داره که برنامه درست اجرا نمیشه؟http://www.talant.ir/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gifلطفا در اسرع وقت جوابمو بدین.ممنون

procedure TForm1Initialize(Sender:TObject);
begin
Randomize;
end;
FUNCTION LEFTDASH(STR:STRING):Integer;
var D:Integer; B:string; E:string;
begin
D:=Pos('-',STR);
E:=Copy(STR,0,D-1);
Result:=STRTOINT(E);
end;
FUNCTION RIGHTDASH(STR:STRING):Integer;
var C,D,right:Integer; f:string;
begin
C:=Length(STR);
D:=Pos('-',STR);
f:=Copy(STR,D+1,C-D);
RIGHT:=STRTOINT(f);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
b,a,f,q:string;
d,c,w,i,e: Integer ;
x,result,right:integer;
begin
form2.ADOTable1.append;
form2.ADOTable1.First;
a:=' ';
a:=form2.ADOTable1.FieldValues['f_randomdigits'];
i:=0;
i:=LEFTDASH(a);
edit1.Text:=inttostr(i);
form2.ADOTable1.Last;
a:=' ';
a:=form2.ADOTable1.FieldValues['f_randomdigits'];
w:=0;
w:=RIGHTDASH(a);
edit2.Text:=inttostr(w);
randomize;
x:=randomrange(w,i);
label3.Caption:=inttostr(x);
end;

firststep
دوشنبه 18 مهر 1390, 15:04 عصر
FUNCTION RIGHTDASH(STR:STRING):Integer;
var
C,D:Integer;
E:string;
begin
C:=Length(STR);
D:=Pos('-',STR);
E:=Copy(STR,D+1,C-D);
///////////////////////////////////////////////
RIGHT:=STRTOINT(E);
///////////////////////////////////////////////
end;



اون خطی رو که علامت گزاری کردم با خطی که بنده حقیر نوشتم درپست قبل چک نمایید

firststep
دوشنبه 18 مهر 1390, 15:08 عصر
برای بازگدانند مقادیر به function (خارج کردن مقادی) یا بایستی از result استفاده کنین یا از نام تایع --- توی پست 15 هر کدام از توابع به یک جور قید شده بیشتر متوجه شین

mnakhaei67
سه شنبه 19 مهر 1390, 11:22 صبح
با سلام.اگه میشه به این اشکالم هم جواب بدید.من میخوام با توجه به اینکه عدد تصادفی در کدام بازه از فیلد f_randomdigits فرمم است عدد معادل آن بازه از فیلد taghaza درهمان جدول را دریافت کند و در فیلد تقاضا از جدول فرم بعدی در برنامه ام قرار دهد.برای این منظور فایل زیر را ملاحظه فرمایید و اشکال کارم را به من گوشزد فرمایید.ممنونم.همچنان منتظر جواب های ارزشمندتان هستم

76471

mnakhaei67
سه شنبه 19 مهر 1390, 11:25 صبح
در ضمن ضمیمه زیر که حاوی پایگاه داده ام میباشد نیز دانلود بفرمایید
76472