الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اعداد عشوائيه بدون تكرار

بدأه ibr_exn في 1 نوفمبر 2008 · 19 رد · 2,267 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

سؤالان للحبايب :

1- الفكرة التقليدية لايجاد ن من الاعداد العشوائيه الغير مكررة باستخدام دالة random ان نستدعيها ومع كل مرة نقارن ناتجها مع النواتج السابقه : زمن التنفيذ تقريبا

ن*ن . فكر في طريقة لايجاد هذه الاعداد في زمن تنفيذ لايتجاوز ن ؟

2- اكتب برنامج باي لغة برمجة بحيث يتم ادخال مجموعة اعداد غير معروف عددها ( لايقاف الادخال ادخل 0 ) بحيث عند انتهاء الادخال يتم طباعتها من الاخير الى الاول.

غير مسموح باستخدام المصفوفات او المؤشرات .فقط متغيرين مسموح بهما من اي نوع اخر .

ملحوظه : توجد اكثر من طريقه للحل .

اذا لم يتوصل احد للحل خلال 3 ايام ساضع الحلول .

في ثلاثة في بالي متاكد انهم حيحلوها

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#2
ibr_exn كتب:
زمن التنفيذ تقريبا ن*ن

وعليكــم السـلام ورحمة الله وبركاتـه..

استفسار، لماذا زمن التنفيذ التقريبي المتوقع n*n ؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3
اقتباس
الفكرة التقليدية لايجاد ن من الاعداد العشوائيه الغير مكررة باستخدام دالة random ان نستدعيها ومع كل مرة نقارن ناتجها مع النواتج السابقه : زمن التنفيذ تقريبا

ن*ن . فكر في طريقة لايجاد هذه الاعداد في زمن تنفيذ لايتجاوز ن ؟

أعتقد انه من الممكن عمل ذلك اذا أخذنا كل عدد جديد على انه حاصل مجموع الذي قبله والتاكد فقط ان العدد المضاف الجديد ليس صفر فقط.

tvquran_6.gif

#4

هذا كود بالسي:

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include<ctime>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. srand(time(0));
  10. long rnd=0;
  11. int a;
  12. cout<<"Enter Number:";
  13. cin>>a;
  14. while(a-- !=0)
  15. {
  16. rnd+=rand()+1;
  17. cout<<rnd<<" : ";
  18. }
  19. system("PAUSE");
  20. return EXIT_SUCCESS;
  21. }
  22.  

tvquran_6.gif

#5

الناتج يكون اعداد عشوائية لكن تصاعدية !

اذن لا يصلح.

خطرت لي فكرة اعتقد جيده.

أنشئت مصفوفة أعطيتها عناصرها قيمة صفر.

ثم كل عدد عشوائ جديدة اعلم ما يقابله من المصفوفة اي اني لا احتاج بحث في كل المصفوفة.

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include<ctime>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. srand(time(0));
  10.  
  11. int a,b;
  12. cout<<"Enter Number:";
  13. cin>>a;
  14. int rnd[10000]={0};
  15. while(a!=0)
  16. {
  17. b=(rand()%10000);
  18. if(rnd[b]!=1)
  19. {
  20. cout<<b<<" : ";
  21. a--;
  22. rnd[b]=1;
  23. }
  24. }
  25.  
  26. system("PAUSE");
  27. return EXIT_SUCCESS;
  28. }
  29.  

tvquran_6.gif

#6

هذا هو الحل و لكن في حال كنت تعتبر الـ STRING كمتحول مستقل و لكن ليس مصفوفة من نوع CHAR :

include<IOSTREAM.H>
main(){
char c;
string s;
int n;
cout<<"enter the numbers";
c=' ';
s='';
n=0;
while c!='0' {
   cin>>c;
   s=s+c;
   n=n+1;}
for (i=n;i>0;i--)
 cout<<S;
return 0;
}

تم تعديل هذه المشاركة بواسطة SYRIAN HAWK في 2 نوفمبر 2008 في 00:49

#7

السلام عليكم ورحمة الله وبركاته

اشكر كل من شارك واسف للتأخير :

بالنسبة للسؤال الاول :

الاخ Xacker :

الخوارزمية التقليديه زمن التنفيذ لها سيكون ن*ن لانه بعد اخر عدد عشوائي اضيفه اكون قد اضفت ن عدد عشوائي وساحتاج ان اقارنه مع كل الاعداد السابقه (ن-1)

وبالتالي حاصل ضرب القيمتين ن * (ن-1) سينتج O n^2حسب نظرية الخوارزميات .

الاخ فهدالشلوي :

لم تتضح الفكرة خاصتك : ما شرط التوقف لتكرار while ؟ اعتقد انه سيستمر بدون توقف . كما انه سيكلفني عملية بحث قد تصل الى ن*ن ايضا

فكرة الحل : 1- اعمل مصفوفة من الاعداد من ا الى ب : حيث ا ب هما المدى الخاص بالاعداد العشوائيه .

2- اعمل تكرار ص من 1 الى ن حيث ن عدد الاعداد العشوائيه المطلوب ايجادها من المدى ا ب

3- استخدم دالة راندوم لايجاد عدد عشوائي مداه من ص الى ن وليكن س

4- اطبع القيمه التي في المصفوفة والتي عنوانها س

5- بدل اول قيمة في المصفوفة مع القيمة التي تمت طباعتها وانتقل للتكرار التالي : ص= ص+1

6- كرر الخطوات 3 4 5 حتى نصل لنهاية المصفوفه .

ارجو ان تكون الفكرة واضحه .

بالنسبة للسؤال الثاني :

يمكن استخدام متغير نصي كما في حل الاخ SYRIAN HAWK

ويمكن ايضا تغيير احداثيات مكان الطباعه لنطبع العدد المدخل في اخر الشاشه وهكذا حتى نصل للعدد الاول .

و يمكن ايضا استخدام التعاوديه بحيث نعمل عبارة الطباعه بعد عبارة ادخال عوديه

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#8

هل قراءت مشاركة رقم 5 ؟

tvquran_6.gif

#9

هل ممكن توضح ماهو دور المتغيرات

تم تعديل هذه المشاركة بواسطة ibr_exn في 3 نوفمبر 2008 في 13:50

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#10

عملت مصفوفة سعتها 10000 عنصر.

يسمح للمستخدم اختيار عدد العناصر اقل من 10000 .

كل عدد عشوائي يظهر نضع رقم 1 في موقعه .

الشرط الخاص باللوب فقط من اجل عدد العناصر الناتجه.

tvquran_6.gif

#11

هذان الحلان غير مقنعان بالمرة

يمكن استخدام متغير نصي كما في حل الاخ SYRIAN HAWK -- هذا الحل يعتبر تحايل لأن المتغير النصي سيكون إما مصفوفة أو حلقات مستسلسلة Linked List

ويمكن ايضا تغيير احداثيات مكان الطباعه لنطبع العدد المدخل في اخر الشاشه وهكذا حتى نصل للعدد الاول . --هذا حل غير مقنع ولا يمكن اعتباره خوارزمية

بالنسبة للحل الأخير

فبالتأكيد خطأ

لأن العودية ستخزن كل متغير من هذه المتغيرات في المكدس

بصراحة لم أفهم موضوع الأعداد العشوائية

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#12

بالنسبة للسؤال الاول : الاجابات صحيحه لانها تحقق شروط السؤال . اذا عندك حل افضل تفضل بطرحه .

السؤال الثاني : مطلوب ايجاد اعداد عشوائيه غير متكرره ( افضل طريقه )

مرفق ملف يحوي مثال بالدلفي

الاخ فهد : هل جربت مثالك على ن=3000 او اكثر ارجو ارفاق مثال مع الملف المصدري .

DistinctRandom.rar

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#13

ارفقت لك البرنامج التنفيذي مضغوط rar فقط لا تدخل رقم أكبر من 10000 لاني الكود المصفوفة معرفة بطول 10000.

الكود هو الذي بمشاركة 5.

Project1.rar

tvquran_6.gif

#14

برنامجك ممتاز اخي فهد :

ولكن ماذا اذا كان المطلوب اعداد عشوائيه ضمن مدى معين فمثلا محتاج اعداد عشوائيه عددها 3000 تكون اكبر من الصفر ولا تزيد عن 3000

او اي مدى اخر .

لماذا : يمكن الاستفادة من هذا البرنامج اذا عندك مصفوفة او قائمة مرتبة وتحتاج اخذ جزء منها او كلها ة بشكل عشوائي وبدون تكرار .

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#15
اقتباس
ولكن ماذا اذا كان المطلوب اعداد عشوائيه ضمن مدى معين فمثلا محتاج اعداد عشوائيه عددها 3000 تكون اكبر من الصفر ولا تزيد عن 3000

او اي مدى اخر .

فقط غير الرقم من 10000 الي 3000

tvquran_6.gif

#16

تمام حيعطي ثلاثة الف عدد عشوائي ولكن المدى ليس من 1 الى 3000 او حسب ما احدده

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#17

بل يعطيك ما تريد بالضبط يالتغيير في السطر التالي :

  1.  
  2. b=(rand()%10000);//0 To 99999
  3. b=(rand()%3000)+1; // 1 To 3000
  4.  

tvquran_6.gif

#18

ممكن الملف التنفيذي

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#19

هذا الكود بعد التعديل:

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include<ctime>
  4. using namespace std;
  5. int main(int argc, char *argv[])
  6. {
  7. srand(time(0));
  8. int a,b;
  9. //cout<<"Enter Number:";
  10. //cin>>a;
  11. a=3000;
  12. int rnd[3000]={0};
  13. while(a!=0)
  14. {
  15. b=(rand()%3000)+1;
  16. if(rnd[b]!=1)
  17. {
  18. cout<<b<<" : ";
  19. a--;
  20. rnd[b]=1;
  21. }
  22. }
  23. cout<<endl;
  24. system("PAUSE");
  25. return EXIT_SUCCESS;
  26. }
  27.  
  28.  

Project1.rar

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 6 نوفمبر 2008 في 13:04

tvquran_6.gif

#20

ممتااااااااز

فعلا يقوم بالمطلوب

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

مواضيع مشابهة