لوا:هل من الممكن تقليل المكرر من داخل الحلقة؟
سؤال
array={}
size=10
math.randomseed(os.time())
for i=1,size do
array[i]=math.random(size)
if(i>1) then
for j=1,i do
if array[j]==array[i] then
i=i-1
break
end
end
end
end
for i=1,size do
print(array[i])
end
كان المقصود من الكود أعلاه إنشاء مجموعة من الأرقام العشوائية من 1 إلى "الحجم" لتجنب تكرار القيم.لقد حاولت تحقيق ذلك من خلال تكرار حلقة المستوى الأعلى "for" مرة أخرى إذا كانت القيمة التي تم إنشاؤها حديثًا موجودة من قبل في مكان ما في المصفوفة - عن طريق تقليل مكررها.بطريقة ما لا يعمل.لماذا؟
هل تعديل قيمة المكرر من داخل الحلقة غير ممكن؟
مثال على الإخراج مع القيم المتكررة في الصفيف:
>lua5.1 "pairsss.lua"
2
1
10
6
5
2
5
7
7
4
>Exit code: 0
المحلول
الحل لمشكلتك هو خلط المصفوفة، مثل التكرار العشوائي لملء جدول في لوا.
للإجابة على سؤالك، من لوا 5.1 الدليل المرجعي:
§2.4.5 – للبيان
يتم تقييم تعبيرات التحكم الثلاثة مرة واحدة فقط، قبل بدء الحلقة.يجب أن تؤدي جميعها إلى أرقام.
وهذا يعني، بغض النظر عن كيفية تغيير قيمة i
داخل for
حلقة، لا تؤثر على كيفية إجراء التكرار.
نصائح أخرى
يمكنك استخدام مجموعة واحدة بدلا من صفيف، كما فعلت مؤلف السؤال أرقام عشوائية في LUA مع عدم تكرار .كأحد الإجابات يشير، نظرا لأن مجموعة حياتك أقرب إلى مجموعتك من أرقام Randome (قل، لديك أرقام عشوائية من 1 إلى 100، ومجموعتك حجم 50) سيكون أكثر وأكثر صعوبة في العثور على رقم ذلكلم يتم اختيارها بالفعل.يمكنك أن ترى أنه لمجموعة من حجم 50 واختيار # عشوائي من 1 إلى 100، ثم بحلول الوقت الذي لديك مجموعة كاملة، لديك فرصة 25-50٪ لإيجاد الاختيار العشوائي قيد الاستخدام بالفعل في حياتكجلس.في هذه الحالة، فإن خلطان هو الطريق للذهاب، كما هو موضح في إحدى الإجابات على هذا المنشور ( أرقام عشوائية في LUA بدون تكرار ).