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

اعداد عشوائية غير متكرره،

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

دالة ماتلاب بسيطة وسريع لايجاد قائمة من الاعداد الصحيحة العشوائية الغير متكررة في مدى معين. فقط ادخل اصغر عدد صحيح واكبرعدد صحيح (اعداد موجبه) ، وستقوم الدالة بعمل مصفوفة من الاعداد لاعشوائية الصحيحة الموجبة ضمن هذين العددين

احتجتها اكثر من مرة اثناء عملي.

يمكن التحميل من هنا او بنسخ الكود في الاسفل

http://www.mathworks.com/matlabcentral/fileexchange/27809-unique-random-integer-list

function r=myrand(a,b)
% Produce unique random integers ranged from a to b
% linear random unique integers
clc;
%a=1; b=50000; %try this as an example
r=a:b; r=r';
for i=1:(b-a)
%    rn=round((a-2)*rand(1,1))+1+(b-a);
    rn=round((b-a-1)*rand(1,1))+1;
    tmp=r(i);
    r(i)=r(rn);
    r(rn)=tmp;
end
%file id = 27809

بالتوفيق،

تم تعديل هذه المشاركة بواسطة ibr_exn في 1 يونيو 2010 في 22:52

3

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

#2

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

بارك الله فيك أخى ابراهيم وجعله فى موازين حساباتك.

للأسف أخى الفاضل استخدام دالة round هنا غير موفق وسيحدث تكرار فى الأعداد الناتجة. لأن الدالة round تعود بأقرب عدد صحيح للعدد الناتج. فمثلا لو فرضنا ان a=1 وان b=50 وبفرض اننا تتبعنا خطوات برنامجك وكان من ضمن الأعداد الحقيقية التى سيتم توليدها -باستخدام دالة rand- الأعداد العشوائية التالية 0.49 و 0.499 و 0.4999 و 0.51 و 0.501 0.5001 و 0.50001 فستجد ان جميعها سينتج لنا -حسب الدالة التى ارفقتها حضرتك- العدد الصحيح 25. وبالتالى احتمالية حدوث التكرار مازالت قائمة مهما كانت صغيرة جدا جدا جدا :). أعتقد ان الحال سيكون كما هو حتى لو تم استخدام اى من الدوال التالية fix or ceil or floor.

ولكن اليك هذه الدالة البسيطة -وربما يوجد ما هو ابسط منها- التى تفى بالغرض ان شاء الله ، والتى تعتمد على دالة randperm الموجوده فى الماتلاب.

function r=myrand(a,b)
% Produce unique random integers ranged from a to b
% linear random unique integers
%a=1; b=50000; %try this as an example

r=a:b;
tmp=randperm(b-a+1);
r=r(tmp);

هذا والله أعلى وأعلم ،،،

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#3

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

اشكر لك اخي د.عماد مرورك وإثرائك للموضوع.

الدالة مجربة وطريقة عملها تختلف عما ذكرت، حيث تقوم بتوليد اعداد صحيحة ومن ثم تغيير اماكنها بشكل عشوائي (يمكن تتبعها للتأكد من ذلك). فقط جربها واخبرني اذا اعطت نتائج خاطئه.(يمكن التأكد باستخدام الداله unique)

جربت الطريقة خاصتك وهي فعلا تعطي نفس النتائج واسرع من ناحية الوقت.

تم تعديل هذه المشاركة بواسطة ibr_exn في 2 يونيو 2010 في 09:16

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

#4
ibr_exn كتب:

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

اشكر لك اخي د.عماد مرورك وإثرائك للموضوع.

الدالة مجربة وطريقة عملها تختلف عما ذكرت، حيث تقوم بتوليد اعداد صحيحة ومن ثم تغيير اماكنها بشكل عشوائي (يمكن تتبعها للتأكد من ذلك). فقط جربها واخبرني اذا اعطت نتائج خاطئه.(يمكن التأكد باستخدام الداله unique)

بارك الله فيك أخى الكريم وشكرا على مجاملاتك وكلامك المهذب.

نعم أخى الكريم كلامك مضبوط ، لن يحدث تكرار :). كنت أظن انه بعد توليد العدد rn سيقوم البرنامج بالعودة بالعدد الموجود بالمتجه r فى الموضع rn. ولأنه سيحدث تكرار للعدد rn للسبب المذكور فى المشاركة السابقة ، فأستنتجت انه سيحدث تكرار فى الناتج. ولكن بعد مراجعة البرنامج ثانية وجدت انك مجرد بتغير موقع الأعداد داخل r. وبالتالى لن يحدث تكرار فى الناتج :)

اما بالنسبة لموضوع السرعة فى برنامجى السابق ، فأكيد جهازك به مشكله :P المفروض ان الدالة السابقة اسرع كثيرا جدا من الدالة التى ارفقتها حضرتك. قمت بعمل تجارب كثيرة على اعداد مختلفه لـ a,b وكنت انفذ دالتك 100 مرة والدالة السابقة 100 مرة واحسب الوقت المستخدم. ووجدت ان الدالة التى ارفقتها حضرتك ابطأ كثيرا من الدالة السابقة ، احيانا تستهلك 23 ضعفا من الوقت اللازم للدالة السابقة.

هذا والله اعلى واعلم ،،،

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

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