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

منع عدم تكرار الرقم العشوائي

مغلق
بدأه AliRahmah في 2 أبريل 2005 · 43 رد · 5,730 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#26

السلام عليكم

حمل الملف في تقينة متعدد المهام وشوية bugs بس ممكن تستفيد منه

بالتوفيق

UniqueRandomizationPredefinded.zip

في المثال يتضح المقال

#27

وعليكم السلام

ماينفتح عندي اي ليش

شوف هذي الرسالة اليي تتطلع ليي بمجرد ما افتحه

الصورة

:(

مسامحة على الازعاج

#28

:(

#29

السلام عليكم

بارك الله فيك علي إرحمه هذه المشكلة أول مرة أشوفها لذلك لا أعرفها

لكن هل كنت تشوف الأمثلة التي وضعتها أنا سابقاً

هل هذه المشكلة فقط مع الملفات التي أرسلها أنا أم مع الكل ؟

جرب برنامج أخر لفك ضغط الملفات

والله يوفقك . و أسف على التأخير

السلام عليكم

في المثال يتضح المقال

#30

لا يا اخي العزيز

مع جميع الملفات ونفس الرسالة

قلت يمكن لانه iis مو مركب عندي

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

عذراً

:(

#31

بالنسبة للأمر Rnd فهو يخرج لك قيمة عشوائية من 0 إلى 1 من ِمصفوفة تحتوي على هذه الأرقام اللانهائية! ورقم المصفوفة 0!

فكلما تنادي على Rnd يأتيك بالرقم التالي في المصفوفة 0. والملاحظ أيضا أنك إذا أعدت تشغيل البرنامج سيعيد لك نفس القيم كل مرة، ذلك لأنك تقرأ من المصفوفة 0. إذا أردت القراءة من مصفوفة أخرى فكل ماعليك هو أن تشير بذلك في البرنامج باستخدام الأمر Randomize وتضيف إليه رقم المصفوفة.

Randomize 1 أو Randomize 2 وبعدها تستخدم أمر Rnd لقراءة الأرقام العشوائية من المصفوفة المعينة.

لاحظ معي أن برنامجك سيقرأ من مصفوفة معينة كل مرة، ويخرج لك نفس القيم كل مرة، وهذا قد لا يعجبك. فأنت تريد أن تقرأ من مصفوفة مختلفة كل مرة تشغل فيها البرنامج، ولحل هذه يمكنك استخدام RandomizeTimer والذي وظيفيته يقرأ الوقت الحالي ويترجمه إلى رقم مصفوفة معينة من Randomize. بهذا تحصل على مصفوفة مختلفة كلما شغلت البرنامج! لأن الوقت يتغير!

------

إضافة إحصائية: المصفوفة تحوي أرقام عشوائية موزعة بطريقة التوزيع العادي Normal Distribution على ما أعتقد. وإن كنت باحتياج مصفوفتين مختلفتين لبرنامجك (توزيعتين مختلفتين)، مثلا تسخدم الأول لإصدار مواقع معينة عشوائية على الشاشة لرسم النجوم، ومصفوفة أخرى لإصدار أرقام عشوائية تبين مواقع سفن الفضاء العدوة!!

إذا كنت تريد ذلك، فأهلا بك في البرمجة الشيئية OOP واستخدم مصفوفتين مخلفتين أو أكثر. باستخدام الفئة Random التي أشار بها أخونا اسماعيل عنجيري وشرحه الغملاسي.

Dim Rnd1 As New System.Random

Dim Rnd2 As New System.Random

فكل من Rnd1 و Rnd2 له مصفوفة مختلفة يقرأ منها! وهذه الطريقة المفضة!

---------------

طبعا يجب عليك حفظ الناتج إن أردت أن لا تسخدم أرقام مكررة مسبقا كما أشار الأعضاء. فاستخدامك العادي لRandomize سينتج لك أرقام مكررة بلا شك! كما أنصح باستخدام مجموعة Collection لحفظ هذه النواتج وليس مصفوفة Array حتى تتمكن من تغيير حجمها كلما تحتاج لذلك! أما أن تستخدم ListBox مخفية فصحيح أنها مجموعة Collection فتستطيع استخدامها لكن هذا ليس الحل الأمثل! وليست هذه وظيفتها. بل استخدم Collection معين بدلا منها!

#32

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

اخي AliRahmah اتمنى ان طريقتي هذه تحل المشكلة

فمن ردودك فهمت ان هناك زر امر اذا ضغطه المستخدم يبدا عرض ارقام من 1 الى 20 في Label سميته LGame10 كل ما استدعي الحدث Tick للـ Timer الذي سميته TGame1 .. وفكرتي ان تضيف Listbox الى الفورم وتجعل خاصية Visable تساوي False لكي لا يراها المستخدم .. وتكتب الكود التالي داخل TGame1

Randomize()
        Dim x, y, z, a As Byte
        y = ListBox1.Items.Count - 1
        For x = 1 To 20
            z = Rnd() * 19
            If ListBox1.Items.Contains(z) = False Then
                If y >= 0  And a = 1 Then
                    ListBox1.Items.RemoveAt(y)
                End If
                ListBox1.Items.Add(z)
                a = 1
                n = z + 1
                LGame10.Text = n
                Exit For
            Else
                x = x - 1
            End If
        Next

وشرح فكرتي تبدأ باستخدامي لـ Randomize وهي كانت تستخدم ايام VB6 وفائدتها انك لو ما استخدمتها وطلبت استخراج رقم عشوائي باستخدام الدالة rnd (وهي تعطي رقم عشوائي بين الصفر والواحد) وشغلت برنامجك فسوف يعطيك ارقام عشوائيه سجل تسلسل الارقام فلنفرض انه اعطاك 5 ثم 3 ثم 1 ثم 5 اغلق برنامجك ثم اعد تشغيله فسوف يعطيك ارقام عشوائية ولكن بنفس الترتيب السابق وهذا ما لانريده ولذا نظطر لاستخدام Randomize لنجعل الرقم العشوائي الذي يعطى من قبل الدالة rnd يعتمد على ساعة النظام فك مره تشغل برنامجك يكون تسلسل اصدار الارقام العشوائية يكون مختلف

عموما فان في VB.NET لا تحتاج لهذه اللخبطه فمجرد استدعاءك للكلاس Random يغنيك عن كل مامضى

ثم وضعت قيمة عدد العناصر الموجودة في الـ Listbox داخل متغير سميته y وطرحت منه 1 وذلك بحكم لو كان هناك عنصر واحد فستكون قيمة y تساوي صفر وذلك ما اريده لان اول عنصر في القائمة الـ Index التابع له يساوي صفر

ثم وضعت حلقة ForNext

ثم وضعت قيمة الرقم العشوائي المراد اصداره في المتغير z ولم استخدم الدالة Int لان المتغير من نوع Byte فلن ياخذ من الرقم العشوائي المعطى الا الرقم الصحيح

ثم وضعت جملة شرطية بحيث لو كان الرقم العشوائي ليس موجودا في الـListbox سيقوم بتنفيذ ما بداخله وهو كالتالي

اولا هناك جملة شرطيه تختبر اذا كان المتغير y اكبر او يساوي صفر واذا كان المتغير a يساوي واحد واذا تحقق الشرط سيقوم بحذف العنصر اللاخير .. وذلك لانك تريد ان كلما دق الوقت للتايمر اعطاء رقم جديد في الليبل حتى ينقر المستخدم زر ايقاف الدولاب .. فنحتاج لحذف العنصر الذي لم يقف عنده الدولاب وبالنسبة للمتغير a فقيمته صفر وذلك يحتاج منك ان تضع في الحدث PFGame2_2_Clickان a=0 بحيث في المره الثانية لدوران الدولاب لا نقوم بحذف الرقم المضاف للقائمة حديثا

ثانيااضافة الرقم المصدر عشوائيا الى الـListbox

ثالثا نجعل قيمة a=1

رابعا نجمع الى الرقم المصدر عشوائيا 1 لانها تبدا من صفر الى 19 .. وانت تريدها من 1 الى 20 ونجعل قيمتها في المتغير n الذي تستخدمه في برنامجك داخل Select

خامسا نظهر الرقم في الليبل LGame10

سادسا نخرج من الحلقه

وهكذا في الدقه التاليه للتايمر يعمل نفس الشئ

اما اذا كان العدد العشوائي المخرج موجود مسبقا داخل الـListbox فانه سيذهب الى Else ويطلب منه طرح رقم من قيمة x ثم يعود للبحث عن رقم جديد

ولا تنسى اذا كان برنامجك يسمح بلعبة جديده من دون الخروج من البرنامج ان تكتب الكود التالي في زر لعبه جديده اذا وجد

ListBox1.Items.Clear()
        a = 0

اتمنى اني افدتك

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#33

السلام عليكم

شكراً جزيلاً على التفاعل هذا والتعاطف معي جزاكم الله خير الجزاء

:)

الاخ العزيز koao

قمت بماقلت ليي باتباع الخطوات هذا كما في الصور

1. وضعت Listbox وخليت الفيزبل حقه فولس

الخطوة الاولى

2. نسخت الكود ووضعته في حدث التايمير

الخطوة الثانية .

3. سويت تنفيذ للبرنامج

الخطوة الثالثة

4. وهنا يلعب مرة والمرة الثانية (يعلق) يتوقف!!!! لين مانغلق البرنامج

الخطوة الرابعة .

ممكن اعرف ليش

مدري سويت مثل ماقلت ليي

بس

الكود

ListBox1.Items.Clear()

a = 0

لأنه عند الخروج من اللعبة والعودة اليه فقط .

عذراً طولت عليكم واجد

اعتذر اشد الاعتذار

:(

#34

حملته ليكم

:(

MyProject.zip

#35

:(

#36

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

احمد الله اننا وصلنا الى نصف الحل

فيه اخطاء في الكود الذي عطيتك .. وكان المفروض اني اجرب الكود في مشروع جديد قبل ارساله .. بحكم ان المشروع الذي ترسله لا يعمل والسبب في ظني عدم احتواءه على ملف الفلاش .. عموما انا تعلمت معلومة جديده .. ان تعريف المتغيرات من نوع Byte لا يقبل عدد سالب .. لذا يجب استخدام متغير من نوع Integer او على الاقل يجب للمتغير y لان قيمته ممكن تكون سالبه ... والشئ الثاني سبب تعليق البرنامج هو استخدام Else والكود الذي بعده .. هذا الكود الجديد بعد التعديلات وارفقته كمشروع ولكن بحكم ان نسختي 2003 فما ادري اذا كان يشتغل عندك

 Dim x, y, z, a, n As Integer
        Randomize()
        y = ListBox1.Items.Count - 1
        For x = 1 To 20
            z = Rnd() * 19
            If ListBox1.Items.Contains(z) = False Then
                If y >= 0 And a = 1 Then
                    ListBox1.Items.RemoveAt(y)
                End If
                ListBox1.Items.Add(z)
                a = 1
                n = z + 1
                Label1.Text = n
                Exit For
            End If
        Next

وبالنسبه للاخطاء عندك

فاولا لم تضع a=0 في الحدث Click لزر الامر المسما عندك PFGame2_2 المسؤول عن ايقاف الفرز او التايمر

وثانيا بالنسبة للكود الموجود في التايمر التابع للفرز TGame1 فيه اكواد كثيره تهتم باصدار الارقام العشوائيه فيجب ازالتها لان الكود السابق سيغنيك .. فمثلا انت وضعت الكود التالي

LGame10.Text = CStr(Int(Rnd() * 20))
        If PFGame2_2.Enabled Then
            LGame10.Text = CStr(Int(Rnd() * 20))

        End If

هذا يجب يزال .. وايضا كتبت بعد On Error Resume Next

n = Int(Rnd(20) * 20) فاظن ان ليس له داعي وان كان لا بد فازله واجعل كود الارقام العشوائيه الذي اعطيتك قبل كودك الخاص بـ On Error Resume Next وما يليه

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

ListBox1.Items.Clear()

a = 0

فلو كان عندك زر امر او خيار في القائمة للعبه جديده من دون الحاجه للخروج فيجب عليك مسح الليست بوكس وجعل قيمة a=0

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

random.zip

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#37

السلام عليكم

يالله صار فيه اخطاء كثيرة كثييييييرة

عذراً يا اخي اتعبتكم معي

ولكن

وضعت مثل ماقلت لي الكود اليي قلت لي به

وهذا هو

On Error Resume Next

start:

System.Windows.Forms.Application.DoEvents()

a1 = Int(Rnd(20) * 20)

FileClose(1)

FileOpen(1, "test", OpenMode.Input)

While EOF(1) = False

Input(1, noa)

Count1 = Count1 + 1

End While

FileClose(1)

Count1 = 0

FileOpen(1, "test", OpenMode.Input)

While EOF(1) = False

Input(1, no)

If a1 = no Then

GoTo start

End If

End While

Dim x, y, z, a, n As Integer

Randomize()

y = ListBox1.Items.Count - 1

For x = 1 To 20

z = Rnd() * 19

If ListBox1.Items.Contains(z) = False Then

If y >= 0 And a = 1 Then

ListBox1.Items.RemoveAt(y)

End If

ListBox1.Items.Add(z)

a = 1

n = z + 1

LGame10.Text = n

Exit For

End If

Next

End Sub

__

هذا الكود الموجود بالتايمر

وعند التنفيذ

اصبح البرنامج يفرز رقمين ومن ثم يتوقف عن الفرز

وعند ما ااضغط على االسؤال يظهر لي سؤال اي رقم

واستمر بالضغط على زر السؤال وييظهر السؤال بدون رقم

!!!!

كيف ذلك !!!!!!!!

طيب عن البرنامج

اي اني اشيل الفلاشة لانه حجمه كبير ايصير ولا يتحمل !!!

اني الآن بحمل الفلاشة بروحها والبرنامج بعد لوحده

وانته ضعه في مجلد ا bin في البرنامج لحتى يشتغل

عذراً على الاطالة عذراً

وشكراً جزيلاً لك

تحياتي ،،

MyProject.zip

#38

ماتحملت الفلاشة

حجها

952

:(:(

#39

عدلت على برنامجك

ورد لي اذا ظبط..

وهذا هديتي لك موقع للا ستضافه المجانية بسعة 100 ميغا

ولكنه لايقبل ملفات من نوع zip انما يقبل cap وما جربت غيرها

انقر هنا

MyProject1.zip

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#40

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

شكراً جزيلاً لتعاطفك معي

وانتمى لك التوفيق والنجاح

بشوف الحين البرنامج

وشكراً جزيلاً لك

تحياتي

:)

#41

:( :( :( :(

ويييييييييه مايطلع ليش كذا

تتطلع ليي نفس الرسالة

اوه صح انته قلت اني استخدم .نت وانته 2003

:( :( :( :( :(

ياربي

طيب هذا الملف الفلاشي حملته على موقع ثاني وشكراً على الموقع اليي عطيتني وياه الحين بسجل في

:)

http://img153.exs.cx/my.php?loc=img153ℑ=game28sy.swf

#42

الرابط ما هو شغال

انا بانتظارك

وجرب انك تفتح ملف الكود (الملف المؤشر عليه في الصوره المرفقه ) فقط من دون فتح المشروع .. لعله يفتح معك وشف التعديلات ان كانت ستحل المشكله

post-43910-1112930165_thumb.jpg

تم تعديل هذه المشاركة بواسطة koao في 8 أبريل 2005 في 06:16

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#43

جميل جداً بارك الله فيك اخي العزيز

الحين مايتعطل البرنامج

مايتكرر العدد

مافيه اي مشاكل

ولكن KeyPress لقد تعطلت .!!!!! وهي عند اختيار الريديو بتون (الجواب) تضغط انتر او اسبيس !!؟؟

وأيضاً لم نضع شيء بالحسبان وهو

انه عند حل جميع الارقام

لابد من تعطيل الزر وظهور رسالة انتهت الاسئلة لقد فزت او حتى عدد الاجوبة الصحيحة والخاطئة

جزاك الله خير الجزاء

سأكمل انا ماتبقى

تحياتي ،،

:)

#44

احمد الله الذي من علي بمساعدتك اخوي AliRahmah .. واشكر لك هذا الموضوع لاني استفدت منه الكثير

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

هذا الموضوع مغلق.

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