मैं एक सोलिटोन वितरण के अनुसार संख्या कैसे उत्पन्न करूं?


10

Soliton वितरण एक सेट पर एक असतत प्रायिकता वितरण है संभावना बड़े पैमाने पर समारोह के साथ{1,,N}

p(1)=1N,p(k)=1k(k1)for k{2,,N}

मैं इसे एक एलटी कोड के कार्यान्वयन के हिस्से के रूप में उपयोग करना चाहता हूं , आदर्श रूप से पायथन में जहां एक समान यादृच्छिक संख्या जनरेटर उपलब्ध है।

जवाबों:


9

यदि हम से शुरू करते हैं , तो sums टेलीस्कोप, संशोधित (संशोधित) CDF के लिए 1 - 1 / k देता है। इसे बदलना, और विशेष केस k = 1 का ध्यान रखना , निम्नलिखित एल्गोरिथ्म देता है (कोडेड इन , मुझे डर है, लेकिन आप इसे पायथन कार्यान्वयन के लिए छद्मकोड के रूप में ले सकते हैं):k=211/kk=1R

rsoliton <- function(n.values, n=2) {
  x <- runif(n.values)         # Uniform values in [0,1)
  i <- ceiling(1/x)            # Modified soliton distribution
  i[i > n] <- 1                # Convert extreme values to 1
  i
}

इसके उपयोग (और एक परीक्षण) के एक उदाहरण के रूप में, चलो N = 10 के लिए मान आकर्षित करते हैं :105N=10

n.trials <- 10^5
i <- rsoliton(n.trials, n=10)
freq <- table(i) / n.trials  # Tabulate frequencies
plot(freq, type="h", lwd=6)

आवृत्ति वितरण


1
संबंधित "मजबूत" सोलिटोन वितरण के लिए, आपको संभवतः थोड़ा कम कुशल समाधान (बाइनरी खोज या समकक्ष के आधार पर) के लिए व्यवस्थित करना होगा।
whuber

तुम इतनी जल्दी कैसे आ गए?
एलेक्स चैम्बरलेन

2
@ एलेक्स चेम्बरलेन क्योंकि वह अच्छा है: डी
gui11aume

7

अजगर ( @ व्हिबर के आर समाधान से अनुकूलित )

from __future__ import print_function, division                                           
import random                                                                   
from math import ceil                                                           

def soliton(N, seed):                                                           
  prng = random.Random()                                                        
  prng.seed(seed)                                                                  
  while 1:                                                                         
    x = random.random() # Uniform values in [0, 1)                                 
    i = int(ceil(1/x))       # Modified soliton distribution                            
    yield i if i <= N else 1 # Correct extreme values to 1                         

if __name__ == '__main__':                                                         
  N = 10                                                                           
  T = 10 ** 5 # Number of trials                                                   
  s = soliton(N, s = soliton(N, random.randint(0, 2 ** 32 - 1)) # soliton generator                   
  f = [0]*N                       # frequency counter                              
  for j in range(T):                                                               
    i = next(s)                                                                    
    f[i-1] += 1                                                                    

  print("k\tFreq.\tExpected Prob\tObserved Prob\n");                               

  print("{:d}\t{:d}\t{:f}\t{:f}".format(1, f[0], 1/N, f[0]/T))                     
  for k in range(2, N+1):                                                          
    print("{:d}\t{:d}\t{:f}\t{:f}".format(k, f[k-1], 1/(k*(k-1)), f[k-1]/T))

नमूना आउटपुट

k   Freq.   Expected Prob   Observed Prob

1   9965    0.100000    0.099650
2   49901   0.500000    0.499010
3   16709   0.166667    0.167090
4   8382    0.083333    0.083820
5   4971    0.050000    0.049710
6   3354    0.033333    0.033540
7   2462    0.023810    0.024620
8   1755    0.017857    0.017550
9   1363    0.013889    0.013630
10  1138    0.011111    0.011380

आवश्यकताएँ

कोड को पायथन 2 या 3 में काम करना चाहिए।


+1 पायथन अनुवाद साझा करने के लिए धन्यवाद। हमारी साइट पर आपका स्वागत है!
whuber

कोई चिंता नहीं। अगर मुझे एलटी कोड काम करते हैं, तो वे GitHub पर होंगे।
एलेक्स चेम्बरलेन

1
GitHub पर @whuber LT कार्यान्वयन अब । सही नहीं है, लेकिन यह एक शुरुआत है।
एलेक्स चैम्बरलेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.