Fahmy Mostafa نشر 19 يونيو 2021 أرسل تقرير نشر 19 يونيو 2021 أحاول أن أقوم بعمل دالة بديلة لدالة random.choice وتقبل الدالة قائمة العناصر وقائمة الاحتمالات كالتالي: lst= [1, 2, 3, 4] choice(lst, [0.2, 0.2, 0.4, 0.2]) وبذلك يمكن أن يكون لكل عنصر فرصة (احتمالية) مختلفة ليتم اختياره. كيف أقوم بعمل مثل هذه الدالة في بايثون؟ هل توجد دالة جاهزة تقوم بهذا الأمر؟ 1 اقتباس
1 سمير عبود نشر 20 يونيو 2021 أرسل تقرير نشر 20 يونيو 2021 هناك طريقتان لإجراء اختيارات عشوائية بإستعمال إحتمالات إختيار لكل عنصر في بايثون: إذا كنت تستخدم Python 3.6 أو أعلى ، فاستخدم ()random.choices عدا ذلك ، استخدم ()numpy.random.choice random.choices: قدم Python 3.6 دالة جديدة random.choices في الوحدة العشوائية. باستخدامها يمكننا إجراء اختيار عشوائي مرجح مع الاستبدال. يمكنك أيضًا تسميتها عينة عشوائية مرجحة مع الاستبدال. توقيع الدالة كالتالي: random.choices(population, weights=None, *, cum_weights=None, k=1) تقوم بإرجاع قائمة بحجم k للعناصر المختارة من المجتمع (population) population: هي بنية التسلسل أو البيانات التي تريد الإختيار منها weights أو cum_weights: لتحديد احتمال الاختيار لكل عنصر. k: عدد العينات التي تريدها من المجتمع (population) ملاحظة: لا يُمكنك تحديد كل من weights و cum_weights في نفس الوقت بل يجب تحديد أحدهما و إن لم يتم تحديد أحدهما ستكون كل العناصر لديها نفس إحتمال الإختيار. عدد العناصر المُحددة في سلسلة الأوزان يجب أن يكون نفس عدد عناصر المُجتمع (population)، تستطيع إستخدام الأعداد الصحيحة (integers) الغير سالبة او floats في الأوزان، الأوزان يجب أن لا تكون سالبة. مثال: اختيار 5 عناصر من القائمة باحتمالات مختلفة import random numberList = [1, 2, 3, 4, 5] print(random.choices(numberList, weights=(10, 20, 30, 40, 50), k=5)) # Output [5, 5, 4, 5, 4] ملاحظة: كما ترى في الخرج ، تلقينا العُنصر "5" ثلاث مرات لأننا خصصنا له أعلى وزن. لذلك فإن لديها أعلى احتمالية ليتم اختيارها مجموع الأوزان ليس 100 لأنها أوزان نسبية وليست نسبًا. حيث أن الإحتمال لكل عُنصر يُحسب كالتالي: وزن العُنصر / مجموع الأوزان. إذا أردنا إرجاع عُنصر واحد فقط سنُحدد k بواحد لكن ناتج الدالة سيكون قائمة تتكون من عنصر واحد. إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال: import random numberList = [1, 2, 3, 4] def choice(population, w): return random.choices(population, weights=w, k=1)[0] print(choice(numberList, (0.2, 0.2, 0.4, 0.2))) إستخدام مكتبة numpy: لتثبيت المكتبة: pip install numpy توقيع الدالة المُستخدمة كالتالي: numpy.random.choice(a, size=None, replace=True, p=None) حيث a هو المجتمع أو مصدر البيانات، size هو عدد العناصر التي نريد إختيارها، و p يُستخدم لوضع إحتمالات الإختيار. ملاحظة: يجب ان يكون مجموع الإحتمالات هو 1. إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال: import numpy as np numberList = [1, 2, 3, 4] def choice(a, w): return np.random.choice(a, p=w) print(choice(numberList, [0.1, 0.6, 0.2, 0.1])) 1 اقتباس
0 Wael Aljamal نشر 19 يونيو 2021 أرسل تقرير نشر 19 يونيو 2021 يمكن الاستعانة بالمكتبة numpy ثم استدعاء الدالة choice من random: numpy.random.choice(numpy.arange(1, 6), p=[0.3, 0.15, 0.25, 0.2, 0.1]) تم تمرير مصفوفة بطول 6 تم توليدها من خلال arange التي هي array of range كمعامل أول ل choice ثم قائمة بالاحتمالات لكل عنصر بالترتيب طول قائمة الاحتمالات بنفس عدد الأعداد المكونة. لاحظ أن مجموع الاحتمالات يساوي 1. 1 اقتباس
السؤال
Fahmy Mostafa
أحاول أن أقوم بعمل دالة بديلة لدالة random.choice وتقبل الدالة قائمة العناصر وقائمة الاحتمالات كالتالي:
وبذلك يمكن أن يكون لكل عنصر فرصة (احتمالية) مختلفة ليتم اختياره.
كيف أقوم بعمل مثل هذه الدالة في بايثون؟ هل توجد دالة جاهزة تقوم بهذا الأمر؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.