0Pricing
R Academy · درس

توليد التوزيعات العشوائية

خذ عينات من التوزيعات الطبيعية والمنتظمة والثنائية الحد وبواسون

توليد التوزيعات العشوائية درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

دوال التوزيعات في R

يوفر R أربع دوال لكل توزيع: r (عشوائي)، وd (كثافة)، وp (احتمال تراكمي)، وq (كمّي). تولّد الدوال r* عينات عشوائية.

# Pattern: r<dist>(n, param1, param2, ...)
# d<dist>(x, ...) -> density/probability
# p<dist>(q, ...) -> cumulative probability
# q<dist>(p, ...) -> quantile

# Example with normal distribution:
rnorm(5, mean = 0, sd = 1)    # 5 random draws
dnorm(0, mean = 0, sd = 1)    # density at x=0
pnorm(1.96, mean = 0, sd = 1) # P(X <= 1.96)
qnorm(0.975, mean = 0, sd = 1) # z-score for 97.5%
cat('Four functions: r, d, p, q for each distribution')

rnorm(): التوزيع الطبيعي

تولّد rnorm(n, mean, sd) عددًا n من العينات من N(mean, sd²). القيمة الافتراضية هي التوزيع الطبيعي المعياري N(0,1). ويُعد التوزيع الطبيعي أساسًا في الإحصاء، إذ تضمن نظرية النهاية المركزية شيوع ظهوره.

set.seed(42)
# Standard normal (mean=0, sd=1)
z_scores <- rnorm(1000)
mean(z_scores)  # ~0
sd(z_scores)    # ~1

# Custom normal (IQ scores: mean=100, sd=15)
set.seed(42)
iq_scores <- rnorm(100, mean = 100, sd = 15)
mean(iq_scores)  # ~100
sd(iq_scores)    # ~15
summary(iq_scores)

# About 68% within 1 sd
mean(abs(iq_scores - 100) < 15)  # ~0.68

runif(): التوزيع المنتظم

تولّد runif(n, min, max) عددًا n من العينات الموزعة بانتظام بين min وmax. تكون جميع القيم في النطاق متساوية الاحتمال. افتراضيًا، تعطي runif(n) قيمًا في [0, 1].

set.seed(7)
# Default: uniform on [0, 1]
u <- runif(5)
print(u)  # values in (0, 1)

# Uniform on [a, b]
temps <- runif(100, min = -10, max = 40)  # temperatures
mean(temps)   # ~15 (midpoint)
range(temps)  # should be within [-10, 40]

# Discrete simulation using floor()
dice_rolls <- floor(runif(10, min = 1, max = 7))
print(dice_rolls)  # integers 1-6
table(floor(runif(600, 1, 7)))  # roughly equal counts

rbinom(): التوزيع ذي الحدين

تحاكي rbinom(n, size, prob) عددًا n من تجارب ذي الحدين، تتكوّن كل منها من size من تجارب Bernoulli باحتمال نجاح prob. استخدم size=1 للحصول على سحوبات Bernoulli.

set.seed(123)
# 10 coin flips (prob=0.5), repeated 5 times
coin_flips <- rbinom(5, size = 10, prob = 0.5)
print(coin_flips)  # number of heads each time

# Bernoulli: single flip (size=1)
flips <- rbinom(20, size = 1, prob = 0.5)
print(flips)  # 0s and 1s
mean(flips)   # ~0.5

# Biased coin (prob=0.7)
biased <- rbinom(1000, size = 1, prob = 0.7)
mean(biased)  # ~0.7

# Many trials: normal approximation kicks in
hundred_flips <- rbinom(1000, size = 100, prob = 0.5)
mean(hundred_flips)  # ~50

rpois(): توزيع بواسون

تولّد rpois(n, lambda) عددًا n من العينات من توزيع بواسون ذي معدل λ. ويُستخدم هذا التوزيع لنمذجة بيانات العد، أي الأحداث لكل فترة: زيارات الموقع في الدقيقة، والعيوب لكل وحدة، والمكالمات في الساعة.

set.seed(5)
# Calls received per hour (average 3)
calls <- rpois(24, lambda = 3)  # 24 hours
print(calls)  # integers, mostly 1-6
mean(calls)   # ~3 (expectation = lambda)
var(calls)    # ~3 (variance = lambda for Poisson)

# Count the distribution
table(calls)

# Rare events (lambda=0.5)
rare_events <- rpois(100, lambda = 0.5)
table(rare_events)  # mostly 0s and 1s
mean(rare_events)   # ~0.5

rexp(): التوزيع الأسي

تولّد rexp(n, rate) عددًا n من العينات من التوزيع الأسي بالمعدل المحدد. ويُستخدم هذا التوزيع لنمذجة الزمن بين الأحداث، أي أزمنة الوصول المتتالية. المتوسط = 1/rate. وله خاصية انعدام الذاكرة.

set.seed(42)
# Time between customer arrivals (rate=2 per minute)
# Mean wait time = 1/2 = 0.5 minutes
arrival_times <- rexp(100, rate = 2)
mean(arrival_times)  # ~0.5
sd(arrival_times)    # ~0.5 (mean = sd for exponential)

# Simulate a queue
cumulative_arrivals <- cumsum(rexp(10, rate = 3))
print(round(cumulative_arrivals, 3))

# Exponential CDF: P(X <= x) = 1 - exp(-rate*x)
pexp(0.5, rate = 2)   # P(wait <= 0.5 min)
mean(arrival_times <= 0.5)  # empirical estimate

sample(): أخذ عينات متقطعة

تسحب sample(x, size, replace) عددًا من العناصر يساوي size من المتجه x. ويعني replace=FALSE (الافتراضي) أخذ عينات دون إرجاع؛ بينما يسمح replace=TRUE بتكرار القيم.

set.seed(10)
# Sample without replacement (like drawing cards)
cards <- 1:52
hand <- sample(cards, size = 5, replace = FALSE)
print(hand)  # 5 unique cards

# Sample with replacement (bootstrap)
x <- c(10, 20, 30, 40, 50)
bootstrap_sample <- sample(x, size = 5, replace = TRUE)
print(bootstrap_sample)  # may have repeats

# Simulate rolling two dice 1000 times
dice <- function() sum(sample(1:6, 2, replace = TRUE))
rolls <- replicate(1000, dice())
table(rolls) / 1000  # empirical probabilities

أخذ عينات موزون

تستخدم sample(x, size, replace, prob) أوزانًا احتمالية. يعيّن المتجه prob احتمالات نسبية لكل عنصر، وهو مفيد للتوزيعات المتقطعة غير المنتظمة.

set.seed(99)
# Loaded die: 6 is twice as likely
faces <- 1:6
weights <- c(1, 1, 1, 1, 1, 2)  # relative
norm_weights <- weights / sum(weights)

rolls <- sample(faces, size = 1000, replace = TRUE,
                prob = norm_weights)
table(rolls) / 1000
# 6 appears ~2/7 ~= 0.286 of the time

# Categorical sampling
categories <- c('A', 'B', 'C')
probs <- c(0.5, 0.3, 0.2)
sample(categories, 10, replace = TRUE, prob = probs)

rgeom() وrnbinom(): توزيعات العد

يعدّ rgeom(n, prob) حالات الفشل قبل أول نجاح. ويعدّ rnbinom(n, size, prob) حالات الفشل قبل تحقيق size من النجاحات. ويُستخدم كلاهما لنمذجة بيانات العد مفرطة التشتت، أي ذات تباين أكبر من تباين بواسون.

set.seed(42)
# Geometric: flips until first head (prob=0.3)
# Number of FAILURES before first success
flips_until_head <- rgeom(10, prob = 0.3) + 1  # +1 for the success
print(flips_until_head)
mean(flips_until_head)  # ~1/0.3 = 3.33

# Negative binomial: overdispersed count data
# e.g., number of parasites per host
counts <- rnbinom(100, size = 2, prob = 0.4)
mean(counts)   # ~3 (theoretical: size*(1-p)/p)
var(counts)    # much larger than mean -> overdispersed

# Compare variance to Poisson with same mean
pois_counts <- rpois(100, lambda = mean(counts))
var(counts) / var(pois_counts)  # > 1

rt() وrf(): توزيعا t وF

تولّد rt(n, df) عينات موزعة وفق t بدرجات حرية df. ومع اقتراب df من ∞، يقترب التوزيع من الطبيعي. وتولّد rf(n, df1, df2) عينات موزعة وفق F، وهي نسبة متغيرين موزعين وفق كاي-تربيع.

set.seed(1)
# t distribution: heavier tails than normal
t_vals <- rt(1000, df = 5)
mean(t_vals)  # ~0
sd(t_vals)    # > 1 (inflated by heavy tails)

# Compare to normal
n_vals <- rnorm(1000)
# t has more extreme values (heavy tails)
sum(abs(t_vals) > 3)   # e.g., ~30
sum(abs(n_vals) > 3)   # e.g., ~3

# F distribution: used in ANOVA F-tests
f_vals <- rf(1000, df1 = 5, df2 = 20)
range(f_vals)   # always positive
mean(f_vals)    # ~df2/(df2-2) = 20/18 = 1.11

تصوير التوزيعات العشوائية

تُظهر المدرجات التكرارية ومخططات الكثافة شكل التوزيعات المحاكاة. قارن الكثافة التجريبية بمنحنيات الكثافة النظرية باستخدام hist() مع إضافة curve(dnorm(...)) فوقها.

set.seed(42)
x <- rnorm(10000, mean = 5, sd = 2)

# Quick summary statistics
summary(x)
cat('Mean:', mean(x), '\n')
cat('SD:', sd(x), '\n')
cat('Skewness (should be ~0 for normal):',
    mean(((x - mean(x))/sd(x))^3), '\n')

# Empirical quantiles vs theoretical
quantile(x, c(0.025, 0.25, 0.5, 0.75, 0.975))
# Compare to theoretical:
qnorm(c(0.025, 0.25, 0.5, 0.75, 0.975),
      mean = 5, sd = 2)

تحقق سريع

اختبر معرفتك بدوال التوزيعات العشوائية في R.

مراجعة: التوزيعات العشوائية

أهم النقاط: استخدم rnorm(n, mean, sd) للتوزيع الطبيعي؛ وrunif(n, min, max) للتوزيع المنتظم؛ وrbinom(n, size, prob) لتوزيع ذي الحدين؛ وrpois(n, lambda) لعدّ بواسون؛ وrexp(n, rate) لأزمنة الانتظار الأسية؛ وsample(x, size, replace) لأخذ العينات المتقطعة. استخدم دائمًا set.seed() قبل توليد أرقام عشوائية في التحليلات القابلة لإعادة الإنتاج.

set.seed(42)
# Quick reference of common distributions:
rnorm(3, mean = 0, sd = 1)        # Normal
runif(3, min = 0, max = 1)        # Uniform
rbinom(3, size = 10, prob = 0.5)  # Binomial
rpois(3, lambda = 3)              # Poisson
rexp(3, rate = 1)                 # Exponential
rt(3, df = 10)                    # Student t
rf(3, df1 = 5, df2 = 20)          # F distribution
rgeom(3, prob = 0.3)              # Geometric
sample(1:10, 3, replace = TRUE)   # Discrete uniform
cat('R has 20+ built-in distributions')

الأسئلة الشائعة

هل درس «توليد التوزيعات العشوائية» مجاني؟

نعم — نص درس «توليد التوزيعات العشوائية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «توليد التوزيعات العشوائية»؟

خذ عينات من التوزيعات الطبيعية والمنتظمة والثنائية الحد وبواسون تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «توليد التوزيعات العشوائية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. set.seed() وقابلية إعادة الإنتاج
  2. توليد التوزيعات العشوائية
  3. أساسيات محاكاة مونت كارلو
  4. إعادة أخذ العينات بطريقة Bootstrap في R
← العودة إلى R Academy