मैं एक फ़ंक्शन rcoin का उपयोग करके 0 से 99 की सीमा में यादृच्छिक संख्या उत्पन्न करने का प्रयास कर रहा हूं जो समान संभावना के साथ 0 या 1 देता है। मैंने निम्नलिखित कोड लिखा है जो rcoin फ़ंक्शन की लगातार कॉल से उत्पन्न बाइनरी नंबर को परिवर्तित करता है, और फिर इसे इस शर्त के साथ लौटाता है कि संख्या 100 से कम है। यहां आर कोड है।

rcoin <- function() {
  rbinom(n = 1, size = 1, prob = 0.5)
}

r100 <- function(n=100) {
  v = n + 1
  while(v > n) {
    v = sum(sapply(0:6, function(i) rcoin() * 2 ^ i))
  }
  v
}

val_plot <- function() {
  N = 10000
  rand_sample <- rep(0, N)
  for (i in 1:N){
    rand_sample[i] = r100()
  }
  hist(rand_sample, breaks = 100)
}

val_plot() 

ऐसा माना जाता है कि 0 से 99 तक एक समान यादृच्छिक संख्याएँ उत्पन्न होती हैं, क्योंकि काटे गए समान वितरण भी एक समान होते हैं। लेकिन जब मैं 10000 उत्पन्न मूल्यों के हिस्टोग्राम को प्लॉट करता हूं, तो मुझे लगता है कि मान 0 असामान्य रूप से बड़ी संख्या में उत्पन्न होता है, लेकिन अन्य सभी मान एक समान वितरण का पालन करते हैं। क्यों? मुझे लगता है कि ऐसा इसलिए है क्योंकि बाइनरी नंबर "11111111" खारिज हो रहा है जबकि "0000000" नहीं है। लेकिन मैं इस मुद्दे को कैसे हल करूं? क्या इसे सुधारने का कोई तरीका है?

2
Prakash Dutta 28 पद 2019, 06:18

1 उत्तर

सबसे बढ़िया उत्तर

यह hist के उपयोग के साथ एक समस्या के लिए आता है, न कि स्वयं फ़ंक्शन। हल करना:

१) while(v > n) { को while(v >= n) { से बदलें ताकि हम १०० से नीचे की संख्याएँ उत्पन्न करें और १०० या उससे अधिक की संख्या को अस्वीकार करें। अन्यथा r100 का आउटपुट 0 से 100 के बीच होगा, न कि 0 से 99 तक।

2) hist(rand_sample, breaks = 100) को hist(rand_sample, breaks = 0:100, right = F) से बदलें। अन्यथा, डिफ़ॉल्ट hist सेटिंग्स 0 और 1 को बिन कर देंगी और पहले बिन को बहुत बड़ा बना देंगी।

हम इस व्यवहार को एक साधारण अंतर्निर्मित समान वितरण से भी देख सकते हैं।

hist(floor(runif(1E6, min = 0, max = 100)), breaks = 100)

enter image description here

hist(floor(runif(1E6, min = 0, max = 100)), breaks = 0:100, right = F)

enter image description here

6
Jon Spring 28 पद 2019, 04:24