NumPy: الأعداد العشوائية
آخر تحديث: 2026-10-11
1. ما ستتعلمه
- ❶ واجهة default_rng Generator الحديثة
- ❷ التوزيعات الشائعة: منتظم، طبيعي، صحيح، اختيار
- ❸ البذر لإعادة الإنتاجية
- ❹ أخذ العينات العشوائية: مع/بدون استبدال
- ❺ واجهة API القديمة مقابل الجديدة
2. قصة
تدير أليس محاكاة مونت كارلو لنموذج مالي. تحصل على نتائج مختلفة في كل مرة — من المستحيل التصحيح. يُظهر لها بوب: "استخدم default_rng(42) — نفس البذرة تُنتج دائماً نفس التسلسل. صَحّح بالبذرة، وانشر بدونها." تصلح أليس بذرتها، وتجد الخطأ في 5 دقائق.
3. واجهة Generator الحديثة
(1) إنشاء Generator
PYTHON
import numpy as np
# الطريقة الحديثة (موصى بها)
rng = np.random.default_rng(42) # بذرة = 42 لإعادة الإنتاجية
# الطريقة القديمة (قديمة)
np.random.seed(42)
(2) التوزيعات الشائعة
PYTHON
rng = np.random.default_rng(42)
print(rng.random(3)) # 3 أعداد منتظمة [0, 1)
print(rng.normal(0, 1, 3)) # 3 أعداد طبيعية معيارية
print(rng.integers(0, 10, 5)) # 5 أعداد صحيحة [0, 10)
print(rng.uniform(0, 10, 3)) # 3 أعداد منتظمة [0, 10)
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(3) أخذ العينات العشوائية
PYTHON
rng = np.random.default_rng(42)
data = np.arange(10)
# مع الاستبدال
sample = rng.choice(data, size=5, replace=True)
# بدون استبدال
sample2 = rng.choice(data, size=5, replace=False)
# الخلط
rng.shuffle(data) # خلط في المكان
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال: توليد التوزيعات العشوائية (الصعوبة ⭐)
PYTHON
import numpy as np
rng = np.random.default_rng(42)
uniform = rng.random(5)
normal = rng.normal(0, 1, 5)
integers = rng.integers(1, 100, 5)
print("Uniform [0,1):", uniform)
print("Normal N(0,1):", normal)
print("Integers 1-99:", integers)
المخرجات:
TEXTUniform [0,1): [0.77395605 0.43887844 0.85859792 0.69736803 0.09417735] Normal N(0,1): [-0.45938412 -0.19865146 0.1113586 -1.00408446 2.02558468] Integers 1-99: [79 64 66 81 96]
▶ مثال: أخذ العينات العشوائية مع وبدون استبدال (الصعوبة ⭐⭐)
PYTHON
import numpy as np
rng = np.random.default_rng(42)
data = np.arange(20)
# مع الاستبدال — يمكن أن يظهر نفس العنصر عدة مرات
with_repl = rng.choice(data, size=10, replace=True)
print("With replacement:", with_repl)
# بدون استبدال — جميع العناصر فريدة
without_repl = rng.choice(data, size=10, replace=False)
print("Without replacement:", without_repl)
# خلط في المكان
rng.shuffle(data)
print("Shuffled data:", data)
المخرجات:
TEXTWith replacement: [ 6 19 9 12 6 15 0 7 3 14] Without replacement: [13 10 8 11 5 1 9 16 18 4] Shuffled data: [ 8 7 13 10 18 3 15 5 14 16 0 9 2 1 11 17 12 19 6 4]
▶ مثال: التسلسلات القابلة لإعادة الإنتاج بالبذور (الصعوبة ⭐)
PYTHON
import numpy as np
# نفس البذرة = نفس التسلسل
rng1 = np.random.default_rng(123)
rng2 = np.random.default_rng(123)
print("rng1:", rng1.random(4))
print("rng2:", rng2.random(4))
# بذرة مختلفة = تسلسل مختلف
rng3 = np.random.default_rng(456)
print("rng3:", rng3.random(4))
المخرجات:
TEXTrng1: [0.18701985 0.68208779 0.60135938 0.51034031] rng2: [0.18701985 0.68208779 0.60135938 0.51034031] rng3: [0.59831648 0.72572267 0.04819845 0.35980509]
س لماذا استخدام default_rng بدلاً من np.random.seed؟
ج default_rng ينشئ كائن Generator مستقلاً — يمكنك الحصول على تيارات مستقلة متعددة. np.random.seed يضع بذرة عامة تؤثر على كل الكود، وهو هش ويمكن أن يسبب تداخلاً بين الوحدات.
س كيف أحصل على نتائج قابلة لإعادة الإنتاج؟
ج مرر بذرة ثابتة: rng = np.random.default_rng(42). نفس البذرة تُنتج دائماً نفس التسلسل. استخدم بذور مختلفة لتشغيلات مختلفة.
س ما الفرق بين random و uniform؟
ج rng.random(size) يُرجع قيماً في [0, 1). rng.uniform(low, high, size) يُرجع قيماً في [low, high). random هي حالة خاصة من uniform(0, 1).
❓ أسئلة شائعة
س ما هو أهم شيء يجب تذكره؟
ج عمليات NumPy مُتجهة — تجنب حلقات Python للحصول على أداء أفضل.
س أين يمكنني معرفة المزيد؟
ج تحقق من وثائق NumPy الرسمية على numpy.org للمراجع التفصيلية والمواضيع المتقدمة.
س هل هذا يعمل مع NumPy 2.x؟
ج نعم — جميع الأمثلة متوافقة مع NumPy 2.x. بعض واجهات API القديمة (مثل np.random.seed) لا تزال مدعومة لكن البدائل الحديثة موصى بها.
📖 ملخص
- استخدم np.random.default_rng(seed) لواجهة Generator الحديثة
- التوزيعات الشائعة: random، normal، integers، uniform، choice
- ابذر RNG الخاص بك للحصول على نتائج قابلة لإعادة الإنتاج
- shuffle يُعدّل في المكان؛ choice يأخذ عينات مع/بدون استبدال
- np.random.seed() القديم لا يزال يعمل لكنه قديم — فضّل default_rng
📝 تمارين
-
مبتدئ (الصعوبة ⭐): استخدم default_rng(42) لتوليد 10 أعداد عشرية عشوائية، و10 أعداد صحيحة عشوائية (0-100)، و10 أعداد من توزيع طبيعي. اطبعها.
-
متوسط (الصعوبة ⭐⭐): ولّد 1000 رقم عشوائي من توزيع طبيعي. احسب متوسطها وانحرافها المعياري. تحقق من أنهما تقريباً 0 و 1.
-
متقدم (الصعوبة ⭐⭐⭐): استخدم rng.choice مع وبدون استبدال لأخذ عينة من 10 عناصر من مجموعة بيانات من 100. اشرح الفرق ومتى تستخدم كل منهما.