كيف يمكنني إنشاء أعداد صحيحة عشوائية في نطاق في Smalltalk؟

StackOverflow https://stackoverflow.com/questions/271394

سؤال

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

إليك ما أتطلع إلى القيام به:

أرقام عشوائية.أحتاج إلى إنشاء رقم عشوائي بين 1 و1000.الآن أنا أقوم بتزييف ذلك من خلال القيام بذلك

rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.

هذا يعطيني رقم بين 0 و 1000.هل هناك طريقة للقيام بذلك في أمر واحد؟مشابه ل

Random between: 0 and: 1000

و/أو تصريحات.هذا واحد يزعج ضوء النهار الحي مني.لقد حاولت عدة تكوينات مختلفة من

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...

لذا فأنا أقوم بتزييفها باستخدام عبارات ifTrue المتداخلة:

(statement) ifTrue:[
    (statement) ifTrue:[...

ما هي الطريقة الصحيحة للقيام و/أو والعشوائية في المحادثات الصغيرة؟

هل كانت مفيدة؟

المحلول

والمشكلة هي أن

 (expr) and: (expr) ifTrue: aBlock

ويتم تحليل مثل and:ifTrue: طريقة إذا نظرتم الى الطبقة المنطقية (وإما صواب أو خطأ على وجه الخصوص)، لاحظت أن ifTrue: هو مجرد طريقة العادية، وأنه لا توجد طريقة و: ifTrue: موجود - ولكن، سهل و اعمل. ذلك أن نوضح أن هذه هي رسالتين، والكتابة

((expr) and: (expr)) ifTrue: aBlock

لتركيبات منطقية أطول، لاحظ أن هناك أيضا أساليب و: و: وو: و: و: نفذت

نصائح أخرى

(1 to: 1000) atRandom

إذا كنت تستخدم VisualWorks، و: يأخذ كتلة كحجة، لذلك كنت أكتب:

(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].

وهناك أيضا &، الذي لا يأخذ كتلة كوسيطة،

aBoolean & anotherBoolean ifTrue:[doSomething].

والفرق هو و: يقيم إلا ما هو في كتلة إذا كان منطقي الأول هو الصحيح (على غرار جافا)، في حين & دائما يقيم على حد سواء

.

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

وأما بالنسبة للعشوائية، ما دمت تقديم طريقة مخصصة، Random >> between: and: فضلا عن بقية التعليمات البرمجية، فإنه يعمل بشكل جيد على جهاز الكمبيوتر الخاص بك الأساتذة. كيف نفعل ذلك على وجه التحديد، ويعتمد على الشكل الذي من المفترض أن يسلم المهمة.

وأما مسألة العشوائية:يعتمد ذلك على إصدار ST الذي تستخدمه.في صرير 3.9، هناك Random>>#nextInt:, ، والذي تم توثيقه كـ "الإجابة على عدد صحيح عشوائي في الفاصل الزمني [1، عدد صحيح]".يقرأ تنفيذه

(self next * anInteger) truncated + 1

لذلك لدي تعليقان هنا:

  1. يجب أن تتعلم حقًا استخدام متصفح الفصل.يمكن أن يجيب هذا على الأسئلة (المتكررة) "ما هي الرسائل التي يمكنني إرسالها إلى كائنات الفئة X"
  2. من الشائع في ST إضافة أساليب جديدة إلى الفئات الموجودة.لذا، إذا كنت تريد أن يكون Random بين: و:، فما عليك سوى إضافته، على سبيل المثال.مثل

    between: low and: high      
       ^(self next * (high-low+1)) truncated + low
    

لوببساطة، دون معرفة لهجة من Smalltalk، وأستطيع أن أعطي فقط إجابة عامة. الطريقة التي ذكرت مسألة عشوائية، نعم هذه هي الطريقة الوحيدة للقيام بذلك إذا أستاذك يحتاج إلى إجابة عامة.

وأما بالنسبة للسؤال و / أو البيانات،

<اقتباس فقرة>   

و/ أو البيانات. هذا واحد الخلل في النهار الحية من لي. لقد حاولت عدة تكوينات مختلفة من

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...

وماذا كنت تريد أن تجرب هي:

(statement) and: [statement] ifTrue: [ ... ]

لاحظ الأقواس، وو: طريقة يأخذ كتلة كحجة

لإنشاء عدة أعداد صحيحة عشوائية بين 1 و 1000
قم أولاً بإنشاء سلسلة أرقام عشوائية.افعل هذا مرة واحدة فقط.

ثم قم بإنشاء رقم عشوائي جديد عن طريق أخذ الرقم التالي من السلسلة.كرر حسب الضرورة.

aRandomSeries := Random new .
    "Seed a new series of random numbers"  

aRandomInt := aRandomSeries newInt: 1000 . 
    "generate a random integer between 0 and 1000"

anotherRandomInt := aRandomSeries newInt: 1000 .
    "generate another random integer between 0 and 1000"

العمليات المنطقية

aBoolean سوف تستجيب ل and: و or:.كلاهما يأخذ كتلة الحجج.

هنا هو كيف تعمل.

and: alternativeBlock
إذا كان المتلقي صحيحا، أجب عن قيمة AlternativeBlock؛وإلا فإن الإجابة خاطئة دون تقييم AlternativeBlock.

or: alternativeBlock
إذا كان المتلقي خطأ، أجب عن قيمة AlternativeBlock؛وإلا فإن الإجابة بصحيح دون تقييم AlternativeBlock.

على سبيل المثال
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]

ومع ذلك، سيقبل كل من Squeak وPharo Smalltalks الحجة بين قوسين ( )
لن يقوم Dolphin Smalltalk بذلك، ويتطلب بشكل صارم بناء جملة Smalltalk القياسي لوسيطة الكتلة.

طرق أخرى ذات صلة:
& ان و لا يتطلب قوسين مربعين (أيكتلة) حجة
| ان أو لا يتطلب قوسين مربعين (أيكتلة) حجة
& و | العمل في Amber وCuis وGnu وPharo وSqueak وVisualAge وVisualWorks Smalltalks.

يوفر Squeak Smalltalk أيضًا:
and:and: }
and:and:and: } هذه تأخذ وسائط كتلة متعددة
and:and:and:and }

or:or: }
or:or:or: } هذه تأخذ وسائط كتلة متعددة
or:or:or:or: }

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top