किसी उद्देश्य के लिए, मुझे "स्लोप्ड वर्दी" वितरण से यादृच्छिक संख्या (डेटा) उत्पन्न करने की आवश्यकता है। इस वितरण का "ढलान" कुछ उचित अंतराल में भिन्न हो सकता है, और फिर मेरा वितरण ढलान के आधार पर वर्दी से त्रिकोणीय में बदल जाना चाहिए। यहाँ मेरी व्युत्पत्ति है:
आइए इसे सरल बनाएं और डेटा फॉर्म से (नीला, लाल समान वितरण) उत्पन्न करें । ब्लू लाइन की प्रायिकता घनत्व फ़ंक्शन को प्राप्त करने के लिए मुझे उस लाइन के समीकरण की आवश्यकता है। इस प्रकार:
और तब से (चित्र):
हमारे पास है:
चूंकि PDF है, CDF बराबर है:
अब एक डेटा जनरेटर बनाते हैं। विचार यह है, कि अगर मैं ठीक कर दूंगा , तो यादृच्छिक संख्या गणना की जा सकती है यदि मुझे यहां वर्णित एक समान वितरण से संख्या मिलेगी । इस प्रकार, यदि मैं तय के साथ अपने वितरण से 100 यादृच्छिक संख्या की जरूरत है , तो किसी के लिए समान वितरण से है "sloped वितरण" से है, और के रूप में गणना की जा सकती:
इस सिद्धांत से मैंने पायथन में कोड बनाया जो दिखता है:
import numpy as np
import math
import random
def tan_choice():
x = random.uniform(-math.pi/3, math.pi/3)
tan = math.tan(x)
return tan
def rand_shape_unif(N, B, tg_fi):
res = []
n = 0
while N > n:
c = random.uniform(0,1)
a = tg_fi/2
b = 1/B - (tg_fi*B)/2
quadratic = np.poly1d([a,b,-c])
rots = quadratic.roots
rot = rots[(rots.imag == 0) & (rots.real >= 0) & (rots.real <= B)].real
rot = float(rot)
res.append(rot)
n += 1
return res
def rand_numb(N_, B_):
tan_ = tan_choice()
res = rand_shape_unif(N_, B_, tan_)
return res
लेकिन इससे उत्पन्न संख्याएँ rand_numb
शून्य या B के करीब हैं (जिसे मैंने 25 के रूप में सेट किया है)। कोई भिन्नता नहीं है, जब मैं 100 नंबर उत्पन्न करता हूं, तो सभी 25 के करीब हैं या सभी शून्य के करीब हैं। एक बार में:
num = rand_numb(100, 25)
numb
Out[140]:
[0.1063241766836174,
0.011086243095907753,
0.05690217839063588,
0.08551031241199764,
0.03411227661295121,
0.10927087752739746,
0.1173334720516189,
0.14160616846114774,
0.020124543145515768,
0.10794924067959207]
तो मेरे कोड में कुछ बहुत गलत होना चाहिए। क्या कोई मेरी व्युत्पत्ति या कोड के साथ मेरी मदद कर सकता है? मैं अब इस बारे में पागल हूँ, मैं कोई गलती नहीं देख सकता। मुझे लगता है कि आर कोड मुझे इसी तरह के परिणाम देगा।
B
theta
n
R
x<-runif(n,-1,1);x<-(ifelse(runif(n,-1,1)>theta*x,-x,x)+1)*(B/2)