لوا:هل من الممكن تقليل المكرر من داخل الحلقة؟

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

  •  21-12-2019
  •  | 
  •  

سؤال

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 بدون تكرار ).

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