يمكن استخدام اختيار الوظائف () والعينة () والاختيارات () في الوحدة النمطية العشوائية لمكتبة Python القياسية لتحديد العناصر واستردادها عشوائيًا من قائمة أو مجموعة أو سلسلة أو كائن تسلسلي آخر (أخذ عينات عشوائية).
الخيار () يحصل على عنصر واحد ، والعينة () والاختيارات () تحصل على قائمة بالعناصر المتعددة. العينة () هي استخراج غير قابل للاسترداد مع عدم وجود تكرارات ، والخيارات () هي الاستخراج القابل للاسترداد مع التكرارات.
يتم توفير المعلومات التالية هنا.
- حدد عنصرًا واحدًا بشكل عشوائي.:
random.choice()
- حدد عناصر متعددة بشكل عشوائي (بدون تكرارات):
random.sample()
- حدد عناصر متعددة بشكل عشوائي (مع التكرارات):
random.choices()
- أصلح بذرة الرقم العشوائي
حدد عنصرًا واحدًا بشكل عشوائي.:random.choice()
مع اختيار وظيفة الوحدة العشوائية () ، يتم اختيار عنصر واحد عشوائيًا من القائمة ويمكن استرجاعه.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
الأمر نفسه ينطبق على المجموعات والسلاسل. في حالة السلاسل ، يتم تحديد حرف واحد.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
خطأ إذا تم تحديد قائمة أو مجموعة أو سلسلة فارغة كوسيطة.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
حدد عناصر متعددة بشكل عشوائي (بدون تكرارات):random.sample()
باستخدام نموذج الوظيفة () للوحدة العشوائية ، يمكنك الحصول على عناصر متعددة عشوائيًا من القائمة. لا يوجد ازدواجية في العناصر (الاستخراج غير القابل للاسترداد).
الوسيطة الأولى عبارة عن قائمة ، والوسيطة الثانية هي عدد العناصر المراد استردادها. يتم إرجاع القائمة.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
إذا تم تعيين الوسيطة الثانية على 1 ، يتم أيضًا إرجاع قائمة تحتوي على عنصر واحد ؛ إذا تم ضبطه على 0 ، فستكون القائمة فارغة. إذا كانت الوسيطة الثانية هي 1 ، يتم إرجاع قائمة تحتوي على عنصر واحد ؛ إذا كانت 0 ، يتم إرجاع قائمة فارغة ؛ إذا كانت الوسيطة الأولى أكبر من عدد العناصر في القائمة ، فسيحدث خطأ.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
إذا كانت الوسيطة الأولى عبارة عن tuple أو سلسلة نصية ، فإن ما يتم إرجاعه يظل قائمة.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
إذا كنت تريد العودة إلى مجموعة أو سلسلة ، فاستخدم tuple () ، انضم ().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
لاحظ أنه لا يتم الحكم على القيمة ، لذلك إذا كانت القائمة الأصلية أو المجموعة الأصلية تحتوي على عناصر بنفس القيمة ، فهناك احتمال أن يتم تحديد نفس القيمة.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
إذا كنت تريد تجنب القيم المكررة ، يمكنك استخدام set () لتحويلها إلى مجموعة (نوع المجموعة) واستخراج العناصر الفريدة فقط ، ثم استخدام العينة ().
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
حدد عناصر متعددة بشكل عشوائي (مع التكرارات):random.choices()
تتيح لك اختيارات الوظيفة العشوائية للوحدة النمطية () استرداد عناصر متعددة عشوائيًا من القائمة ، وعلى عكس العينة () ، فإنها تسمح بتحديد العناصر المكررة.
الخيارات () هي وظيفة مضافة في Python 3.6. إنه غير متوفر في الإصدارات السابقة.
تحدد الوسيطة k عدد العناصر المراد استردادها. الازدواجية مسموح بها ، لذا فإن عدد العناصر المراد استرجاعها يمكن أن يكون أكبر من عدد العناصر في القائمة الأصلية.
نظرًا لأن k هي وسيطة للكلمات الرئيسية فقط ، فمن الضروري تحديد كلمة أساسية ، مثل k = 3.
import random
l = [0, 1, 2, 3, 4]
print(random.choices(l, k=3))
# [2, 1, 0]
print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]
القيمة الافتراضية لـ k هي 1 ؛ إذا تم حذفه ، يتم إرجاع قائمة بها عنصر واحد.
print(random.choices(l))
# [1]
يمكن استخدام أوزان الوسيطة لتحديد الوزن (الاحتمال) الذي سيتم تحديد كل عنصر فيه ، ويمكن أن يكون نوع العناصر في القائمة صحيحًا أو عائمًا.
print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]
print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]
يمكن أيضًا تحديد الوسيطة cum_weights كوزن تراكمي. إن cum_weights في نموذج الكود التالي تعادل الأوزان الأولى أعلاه.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
الافتراضي لكل من الوسيطات أوزان و cum_weights هو بلا ، مما يعني أنه يتم تحديد كل عنصر بنفس الاحتمال.
إذا كان طول (عدد العناصر) أوزان الوسيطات أو cum_weights مختلفًا عن القائمة الأصلية ، فسيحدث خطأ.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
ومن الخطأ أيضًا تحديد الأوزان والأوزان في نفس الوقت.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights
لقد حددنا القائمة باعتبارها الوسيطة الأولى كمثال في نموذج التعليمات البرمجية حتى الآن ، ولكن الأمر نفسه ينطبق على المجموعات والسلاسل النصية.
أصلح بذرة الرقم العشوائي
من خلال إعطاء عدد صحيح تعسفي لبذرة وظيفة الوحدة العشوائية () ، يمكن إصلاح العدد الأولي العشوائي ويمكن تهيئة مولد الأرقام العشوائية.
بعد التهيئة بنفس الأصل ، يتم دائمًا تحديد العناصر بنفس الطريقة.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3